我在内部阅读过R2将上下文存储为两个表,一个用于单词,另一个用于值,因此您可以请求它们:
o: context [a: 1 b: 2]
>> first o
== [self a b]
>> second o
== [make object! [
a: 1
b: 2
] 1 2]无论如何..。
>> pick o 1
== [self a b]
>> pick o 2
== [make object! [
a: 1
b: 2
] 1 2]但是有第三个“表”(一个块),它似乎没有文档,而且这个表只能使用第三个函数访问。
>> third o
== [a: 1 b: 2]
>> pick o 3
** Script Error: Out of range or past end
** Near: pick o 3第三个街区应该是什么?
类似的事情似乎发生在函数中,但这次第三次和第三次都表现得很好:
>> f: func [a] [print a]
>> first :f
== [a]
>> second :f
== [print a]
>> third :f
== [a]
>> pick :f 1
== [a]
>> pick :f 2
== [print a]
>> pick :f 3
== [a]第一个块是params,第二个块是body,但是这个第三个块在函数中代表什么?
发布于 2014-02-26 21:47:33
你注意到了:
>> third o
== [a: 1 b: 2]
>> pick o 3
** Script Error: Out of range or past end
** Near: pick o 3...which很奇怪。在Rebol2中,对于某些边缘情况,第三项似乎并不完全等同于选择3。*-/
在Rebol3中,情况已不再如此。但是,在Rebol3中,位置选择不再适用于对象或函数:
>> pick object [a: 1 b: 2] 1
** Script error: pick does not allow object! for its aggregate argument相反,你有词-OF,VALUES OF和BODY-OF:
>> words-of object [a: 1 b: 2]
== [a b]
>> values-of object [a: 1 b: 2]
== [1 2]
>> body-of object [a: 1 b: 2]
== [
a: 1
b: 2
]它们已经在一个名为"R2/Forward“的内置库中移植到Rebol2,因此您可以(并且应该)使用这些函数来代替位置选择。
你注意到从第一和第三处得到了类似的答案:
>> f: func [a] [print a]
>> first :f
== [a]
>> second :f
== [print a]
>> third :f
== [a]
>> pick :f 1
== [a]
>> pick :f 2
== [print a]
>> pick :f 3
== [a]第一个块是params,第二个块是body,但是这个第三个块在函数中代表什么?
您的示例太简单了,无法注意到第三个规范的区别在于它是规范,因为您的规范只包含单词。所以,规范--等同于词语--OF。将一个类型约束添加到您的规范中会显示不同之处。
>> f: func [a [integer!]] [print a]
>> first :f
== [a]
>> third :f
== [a [integer!]]再次,Rebol2通过R2/前进为您提供词-OF,SPEC-OF和BODY-OF的函数。再次,避免对这些属性使用位置选择。
发布于 2014-02-26 21:45:15
Third返回对象定义。
>> body: [a: 1 b: 2]
== [a: 1 b: 2]
>> obj: context body
>> equal? body third obj
== true
>> strict-equal? body third obj
== true它与Rebol 2.7.7及更高版本和Rebol 3中的body-of相同。
https://stackoverflow.com/questions/22053821
复制相似问题