pep*_*pep 5 function rebol object rebol2
我已经在内部读取R2存储上下文作为两个表,一个用于单词,另一个用于值,因此您可以要求它们:
o: context [a: 1 b: 2]
>> first o
== [self a b]
>> second o
== [make object! [
a: 1
b: 2
] 1 2]
Run Code Online (Sandbox Code Playgroud)
以任何方式...
>> pick o 1
== [self a b]
>> pick o 2
== [make object! [
a: 1
b: 2
] 1 2]
Run Code Online (Sandbox Code Playgroud)
但是有第三个"表格"(一个块)似乎没有记录,而且这个只能使用第三个功能访问
>> third o
== [a: 1 b: 2]
>> pick o 3
** Script Error: Out of range or past end
** Near: pick o 3
Run Code Online (Sandbox Code Playgroud)
什么应该是第三块?
类似的东西似乎在功能中出现,但这次第三和选择都表现良好:
>> 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]
Run Code Online (Sandbox Code Playgroud)
第一个块是params,第二个块是body但是第三个块在函数中代表什么?
你注意到:
>> third o
== [a: 1 b: 2]
>> pick o 3
** Script Error: Out of range or past end
** Near: pick o 3
Run Code Online (Sandbox Code Playgroud)
...这很奇怪。在 Rebol2 中,对于某些边缘情况,THIRD 似乎并不纯粹与 PICK 3 同义。:-/
在 Rebol3 中,情况不再如此。但情况也不再是这样了,在 Rebol3 中,位置拾取不适用于对象或函数:
>> pick object [a: 1 b: 2] 1
** Script error: pick does not allow object! for its aggregate argument
Run Code Online (Sandbox Code Playgroud)
相反,您有 WORDS-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
]
Run Code Online (Sandbox Code Playgroud)
这些已被反向移植到名为“R2/Forward”的内置库中的 Rebol2,因此您可以(并且应该)使用这些函数来代替位置选取。
您注意到从 FIRST 和 THIRD 得到了类似的答案:
>> 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]
Run Code Online (Sandbox Code Playgroud)
第一个块是 params,第二个块是 body,但是第三个块在函数中代表什么?
你的例子太简单了,无法注意到第三个的区别是它是 SPEC-OF,因为你的规范只包含单词。所以 SPEC-OF 等于 WORDS-OF。在规范中添加类型约束可以揭示其中的差异。
>> f: func [a [integer!]] [print a]
>> first :f
== [a]
>> third :f
== [a [integer!]]
Run Code Online (Sandbox Code Playgroud)
Rebol2 通过 R2/Forward 再次为您提供函数的 WORDS-OF、SPEC-OF 和 BODY-OF。再次强调,避免对这些属性使用位置选择。