这个问题是关于动态地将代码添加到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 o
或second 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]
为什么会这样?
答案 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
而不是first
,values-of
代替second
和{{ 1}}而不是body-of
。自Rebol 2.7.7(自5年前推出)以来,有序反射器已被弃用,并已在Rebol 3中删除。)