因为我们得先讨论行为。如前所述:□ ship本身(包括知识2、3、4)和知识5、6,是定义行为;□知识1、7是找到行为;口ship()、row()、checkShore()是行为°。
行为总是未可知且无穷尽的,例如路人甲面对河岸时的可能选择与解。但是“定义”与“找到”行为的方法则可以确定。对于前者(定义行为),它与声明一个变量本质上没有区别,例如:var ship;对于后者(找到行为),如果ship可以像变量一样被定义,那么我们找到它的方法也就与(此前我们讨论过的)“通过标识找到值”没有什么不同。换言之,总是可以将变量和方法统一为数据。
①我们将ship理解为行为的定义,而将ship()理解为行为的能力——这出于程序与抽象表达上的需要,而与英文的惯例是不同的。一旦使用ship(),则说明是指该“划船”作为一个系统的、整体的行为的实施过程。
【四】
回顾上一节的所有讨论,我们在语言中使用一个数据的方法,根底上只是如下过程:找到它,使之参与运算。而关联数组使“找到数据”这件事变成对一个计算背景的维护。例如,我们有一段代码:vara = 100,b ='abc',c = false;这些数据的定义可以被理解为一个背景的建立(当然,我们也可以为零个数据建立一个背景),因此我们得到一个关联数组:aAssociativeArray ={'a':100,'b':'abc','c':false5}接下来我们在这个背景环境中运算。但——根据语言的不同——我们可能又需要“即用即声明”一个数据,例如:1for(var i=0;i<100;i++){3|}而i这个数据的出现,意味着我们需要在aAssociativeArray中添加一个新的Name。虽然i的值是可变的,而在整个过程中i的名字却不变,因此我们对于aAssociativeArray的Name只有添加和删除的需求,不需要因为值的改变而导致Name的改变。更进一步,我们事实上是将一个数据的生存周期映射成了一个Name的增删。
【五】yipindushu.com
接下来我们讨论与此相关的四个问题。在讨论语言与关联数组的性质的过程中,这些问题分别在以下章节中出现过:其一是增删Name的必要性,即如果一个语言认为变量是计算的前设(不支持变量的动态声明),则我们只需要一个静态的关联数组来维护其背景,否则我们需要一个动态维护的关联数组。这意味着我们在静态语言和动态语言①中都可以使用关联数组。尤其重要的是,对于静态语言来说,我们可以在编译期使用关联数组,而无需在数据区保存一个用来复查的Name列表。
其二是Name作为前设,但其值仅在计算过程中可知,这一绑定关系可以变成在上述背景中的一个值的修改。也就是说,a = a * 5可以映射为:aAssociativeArray['a']= aAssociativeArray['a']* 5;与此相关的,a的确定性(是否可以改变值)也可以映射为对aAssociativeArray中的名字a的访问限制,即aAssociativeArray['a’]是否可写。
其三是如果我们需要在计算过程中新建一个数据,它的含义无非是我们要在上述关联数组中添加一个“名/值”。例如我们在上述背景中执行如下代码:eval('var x=1000')如果这行代码得以执行,它表明需要动态创建x这个名字,我们只需要将该Name添加到aAssociativeArray中,并置值为1000即可。当然,这也相应要求aAssociativeArray是可以动态维护的。
其四,如果我们试图在运算过程中访问一个并不存在的名字,对于没有这一项需求的静态语言来说,aAssociativeArray(可选的)可以不保存Name列表;对于动态语言来说,它将表现为在aAssociativeArray中无法查找到某个Name。
可见,对于一个计算过程来说,关联数组可以维护它所需的一切参考,所有的数据性质都可以表述为关联数组与其存取的性质。我们称这一运算所需的参考为上下文环境(context, context environment)。上下文是保证一个运算具有确定性的主要方式,换言之,它相当于语言中的语用这一要素。对于计算来说,在此前的讨论中我们说过“数据确定,则运算确定”,因此关联数组本质上只是为计算维护了一些数据而已。
版权声明
本站素材均来源与互联网和网友投稿,欢迎学习分享
【节数以及对数据的性质的思考20:http://www.yipindushu.com/xuexifangfa/16562.html
推荐文章
09-03
1 哲理抖音句子大全09-13
2 正能量语录大全,让心灵充满阳光09-03
3 哲理人生语录哲理句子09-13
4 【节应用开发的背景与成因609-03
5 哲理句子大全网