为什么动态添加代码对象在Rebol2中生效?

时间:2014-02-26 22:17:05

标签: object append block rebol rebol2

这个问题是关于动态地将代码添加到rebol 2中的上下文或对象,它与问题Dynamically adding words to a context in REBOL有关,但它不是同一类。

如果我想使用代码块动态地将代码添加到rebol对象,我会因为奇怪的行为而遇到麻烦:

>> append third o [c: 3]
== [a: 1 b: 2 c: 3]

但是...

>> first o
== [self a b]
>> second o
== [make object! [
        a: 1
        b: 2
    ] 1 2]
>> third o
== [a: 1 b: 2]

附件丢失了!如果附加到first osecond o

,则相同

使用“常用”块不会发生这种情况:

>> m: [a [b] c]
== [a [b] c]
>> append m 3
== [a [b] c 3]
>> m
== [a [b] c 3]
>> append second m 1
== [b 1]
>> m
== [a [b 1] c 3]

为什么会这样?

1 个答案:

答案 0 :(得分:5)

third函数不返回原始对象规范,它返回一个新的set-words块和从对象的单词和值生成的值。所以你要附加到那个新块(它会影响块而不是对象)。

您无法获得作为对象规范传入的原始块的系列引用。它在构造对象后被抛弃,无论如何它对对象没有进一步的影响。所以即使你已经保存了对传递给make object的块的引用,附加到它也不会对该对象做任何事情。

你根本无法附加到Rebol 2中的对象。但是在Rebol 3中,你可以附加到对象:

>> append make object! [a: 1 b: 2] [c: 3]
== make object! [
    a: 1
    b: 2
    c: 3
]

(注意:不要在Rebol 2中使用序数反射器。使用words-of而不是firstvalues-of代替second和{{ 1}}而不是body-of。自Rebol 2.7.7(自5年前推出)以来,有序反射器已被弃用,并已在Rebol 3中删除。)