在REBOL中向上下文动态添加单词

时间:2008-11-04 20:53:53

标签: rebol rebol2

想象一下以下REBOL代码:

foo: context [bar: 3]

我现在有一个上下文foo,其中定义了'bar。如何在此上下文中动态注入新单词?有可能吗?

我试过了:

set/any in foo 'baz 3

但这不起作用,因为表达式in foo 'baz失败,因为'baz上下文中没有定义单词foo

我应该补充一点,我知道有一种方法可以做到这一点:

foo-prototype: [bar: 3]
foo: context foo-prototype
foo: context head append foo-prototype [baz: 3]

但是,如果您无法访问foo的原型块呢?

3 个答案:

答案 0 :(得分:8)

您可以通过使用现有对象作为原型来创建新对象来实现相同目的。

>> foo: make object! [bar: 3]
>> foo: make foo [baz: 3]
>> probe foo
make object! [
    bar: 3
    baz: 3
]

答案 1 :(得分:4)

有几种方法可以解决这样一个事实:在REBOL / 2中,扩展对象上下文是不可能的。

可能你只能使用BLOCK!s而不是OBJECT!s:

>> blobject: [foo 1]
== [foo 1]
>> blobject/bar
** Script Error: Invalid path value: bar
** Near: blobject/bar
>> append blobject [bar 2]
== [foo 1 bar 2]
>> blobject/bar: 3
== 3

你甚至可以通过追加对象本身来实现自我工作:

>> insert blobject reduce ['self blobject]
== [[...] foo 1 bar 2]
>> same? blobject blobject/self
== true

但是,当您要求扩展 OBJECT!s 时,您可以选择Peter W A Wood的解决方案来简单地克隆该对象。请记住,通过这种方法,生成的克隆实际上与原始对象不同。

因此,如果在克隆/扩展之前设置了某个单词以保留对象,则在克隆该单词后该单词仍将保留未扩展对象:

>> remember: object: make object! [foo: 1]
>> object: make object [bar: 2]
>> same? remember object
== false
>> probe remember
make object! [
   foo: 1
]

如果您必须保持对象的“引用”不变,那么您可能希望将需要扩展的对象包装在外部对象中,如

>> remember: object: make object! [access: make object! [foo: 1]]
>> object/access: make object/access [bar: 2]
>> same? remember object
== true

然后,您可以在保留的同时延伸对象,只要您只存储对容器的引用。

REBOL / 3,顺便说一句,将允许向OBJECT添加单词!

答案 2 :(得分:1)

在REBOL /核心用户指南中说: “许多块包含其他块和字符串。当复制这样的块时,它的 子系列不会被复制。子系列直接引用并且是相同的 系列数据作为原始块。“