5

我在内部读过 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

这第三块应该是什么?

函数中似乎发生了类似的事情,但这次 third 和 pick 都表现良好:

>> 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]

第一个块是参数,第二个块是主体,但是第三个块在函数中代表什么?

4

2 回答 2

3

Third返回对象定义。

>> body: [a: 1 b: 2]
== [a: 1 b: 2]
>> obj: context body
>> equal? body third obj
== true
>> strict-equal? body third obj
== true

它与body-ofRebol 2.7.7 和更高版本以及 Rebol 3 中的相同。

于 2014-02-26T21:45:15.587 回答
2

你注意到:

>> third o
== [a: 1 b: 2]

>> pick o 3
** Script Error: Out of range or past end
** Near: pick o 3

......这很奇怪。在 Rebol2 中,对于某些边缘情况,THIRD 似乎并不是 PICK 3 的纯粹同义词。:-/

在 Rebol3 中,情况不再如此。但是不再是这样的情况是,在 Rebol3 中,位置拾取不适用于对象或函数:

>> pick object [a: 1 b: 2] 1
** Script error: pick does not allow object! for its aggregate argument

相反,您有 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
]

这些已在名为“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]

第一个块是参数,第二个块是主体,但是第三个块在函数中代表什么?

您的示例太简单了,无法注意到第三个的区别在于它是 SPEC-OF,因为您的规范仅包含单词。所以 SPEC-OF 等于 WORDS-OF。在您的规范中添加类型约束揭示了差异。

>> f: func [a [integer!]] [print a]

>> first :f
== [a]

>> third :f
== [a [integer!]]

再一次,Rebol2 via R2/Forward 为您提供 WORDS-OF、SPEC-OF 和 BODY-OF 功能。再一次,避免对这些属性使用位置选择。

于 2014-02-26T21:47:33.673 回答