2.4 接收消息
而通过操作,可以从channel接收并删除一个消息,接收到的消息是一个name(quoted process)
new myName in {
for( v
for后面的花括号是一个在接受到消息后执行的process,称之为continuation。
2.5 并行执行
在Rholang的世界中,是不存在顺序执行的。
如果需要先执行完A然后执行B,那么A和B之间一定有某种数据依赖,需要通过上面的消息机制实现。
一般地,通过P|Q操作并行地执行多个process。 比如:
new myName in {
for( v
这段代码并行执行了两个process:其中一个process向myName发送了"Hello World"字符串;另一个process从myName读取一条消息后啥也不做。
2.6 Reflect和Reify
上面讲到的几个基本操作实际上都继承自π-calculus。 那么剩下的两个操作,就是rho-calculus对π-calculus的发展。
在rho-calculus中, name(quoted process)是process的引用,它代表的是指向的process的代码,亦既process的语法结构(syntactic structure),
可以简单地类比为磁盘上的可执行文件;
而process是一个可运行的实例,类比于执行文件启动后创建的进程,是一个动态的概念。
通过* 和 @ 两个操作符可以让name(quoted process)和process相互转换,如下图。
*x Reify操作将name(quoted process)反序列为process
@P Reflect操作将process序列化为相应的name(quoted process)
例1:
@"stdout"!("Hello World")
如前文所说,一切都是process。那么"stdout"和"Hello World"都是process。将"Hello World"这个process发送给"stdout"肯定是不行的。
因为根据x!(Q),发送的目的必须是一个name。因此@"stdout"操作将"stdout"这个process转换成了相应的name。实际上这就是一个系统合约:使用标准输出返回消息。
例2:
new myName in {
for( v
从myName中获取的消息以v标识,根据前面的文法for( ptrn1 ,v一定是一个name。
而接下来需要将v发送到@"stdout",又根据x!(Q)发送的必须是process而不能是name,因此需要*v装换成了相应的process。
例3:
new myName in {
for( @v
这段代码和例2的代码非常类似。不同的是,接受到的消息用@v标识符表示,那么这里v是一个process,因此可以直接发送给@"stdout"
*x和@P两个操作的加入让rholang具备了反射的能力。这里所说的反射不同于JAVA/C#程序员熟悉的元编程(meta-programming)。
rholang的反射是一种过程化的反射,它使得process具有迁移到网络上其它节点执行的能力,因此Rho-calculus还有个别名叫移动进程演算(Mobile process calculus)。
例4:
new myName in {
for( v
这段代码将{ @"stdout"!("Hello World") }这个process发送到了myName,另一个process在接收到后执行该process。
需要注意的是myName!({ @"stdout"!("Hello World") })和for( v 这两个process是可以在不同的网络节点上执行。
但是对于rholang程序开发者是透明的。这就是rholang的可迁移性(Mobility),它使Rholang程序在RChain的网络上“流动”,具体的细节在后文名字空间一节中详述。
BitMere.com is Information release platform,just provides information storage space services.
The opinions expressed are solely those of the author,Does not constitute advice, please treat with caution.