pep*_*pep 2 rebol append block object rebol2
这个问题是关于动态地将代码添加到rebol 2中的上下文或对象,它与问题有关.在REBOL中动态地将单词添加到上下文但它不是同一种类.
如果我想使用代码块动态地将代码添加到rebol对象,我会因为奇怪的行为而遇到麻烦:
>> append third o [c: 3]
== [a: 1 b: 2 c: 3]
Run Code Online (Sandbox Code Playgroud)
但...
>> first o
== [self a b]
>> second o
== [make object! [
a: 1
b: 2
] 1 2]
>> third o
== [a: 1 b: 2]
Run Code Online (Sandbox Code Playgroud)
附件丢失了!如果附加到first o或,则相同second o
使用"common"块不会发生这种情况:
>> 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]
Run Code Online (Sandbox Code Playgroud)
为什么是这样?
该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
]
Run Code Online (Sandbox Code Playgroud)
(注意:不要在Rebol的使用顺序反射2.使用words-of代替first,values-of而不是second和,body-of而不是third因为雷博尔2.7.7,出来5年前的序反射器已被否决,并在雷博尔已被删除. 3.)