程序原本(九十二):系统的基础部件——消息(函数的数据含义(返回值)只能表明 x’与 Sx 之一)

阅读数:26 2019 年 10 月 5 日 13:43

程序原本(九十二):系统的基础部件——消息(函数的数据含义(返回值)只能表明x’与Sx之一)

我们为什么需要状态?

事实上我们是把两种时序依赖都最终归结于“数据依赖”,进而将这种依赖关系委托于这个“(数据全集中的)状态”。并且,我们要求状态本身只是纯粹的数据,而将状态的相关逻辑视作公共规约。我们其实是在讨论如图 45 所示的模型:

图 45 将状态从纯数据中剥离,并讨论与逻辑步骤 (Step) 间的关系

程序原本(九十二):系统的基础部件——消息(函数的数据含义(返回值)只能表明x’与Sx之一)

这一模型的本质仍是基于“逻辑作用于数据”这一思想。也就是说,它是基于命令式语言设计范式:我们将状态{Sx}视为{x,x}的操作句柄,并通过某种规则在 Step1, … , StepN 之间传递该句柄的执有权(类似于一种令牌)。

既然 Sx 的抽象含义要求“含义与可操作性”明确,同时我们也知道,函数既包含一个数值含义的传出,也包含可操作性明确的逻辑,可见函数在抽象概念上是满足“状态”的两个要素的。那么,Sx 本身为什么不能是一个函数呢?

问题仅在于,“状态”作为数据含义时是与{x,x}相关的,而“函数”作为数据含义时是指它的传出。也就是说:

复制代码
function foo() {
return 5;
}

可以在数据上表明:

复制代码
foo = 5

但这也导致我们无法通过return来表明foo()这个函数的(数据含义的)状态1

1 return既已用于表明 foo 的数据含义,则必然无法用于表示“含义与可操作性确定的、foo() 的整体含义”。即它不能既表示 foo() 的部分含义,同时又表示 foo() 的整体含义。这种“既是又非”有违于基本逻辑的矛盾律。

解决这一问题的方法,就是消息。例如:

复制代码
function foo() {
send(bar, '...')
return 5;
}

这个例子中,foo()bar()发送了一个消息’…’,这个消息用于指明foo当前所持有的数据的某个状态。由于foo()可以持有多个数据——多个数据全集,或者由多个子集构成的集合——所以它也可以发送一个复合信息的消息,或用某个单一消息来指示所有数据的状态。

评论

发布