当你加载一个字符串时,它默认偏向用户上下文:
>> f: 3
>> outside: object [
f: 4
getter: does [
print reduce compose [(load "f")]
]
]
>> outside/getter
3
这是LOAD's implementation的工件,它使用intern
到"从lib导入(内化)单词及其值到用户上下文中。&# 34;
为了解决这个问题,我可以节省自己通过LOAD创建可能无用的绑定的低效率,使用TO-WORD,然后使用对象的self
来重新绑定它:
>> m: 10
>> inside: object [
m: 20
getter: does [
print reduce [(bind to-word "m" self)]
]
]
>> inside/getter
20
现在我的问题:
鉴于definitional "scoping"的工作方式,对于此模式getter-code
和getter-text
输出4 20
,根本没有办法 - 现在或未来:
>> f: 0
>> m: 0
>> ctx: context [
f: 4
m: 10
both: object [
m: 20
getter-code: does [print [f m]]
getter-text: does [impossible-print ["f" "m"]]
]
]
E.g。在impossible-print
无法写入的地方,根本缺少一些东西?
答案 0 :(得分:2)
正如您正确指出的那样,LOAD会偏向用户上下文。 如果无法访问要绑定单词的上下文(将从" f"和#34; m")加载到,您的函数确实是不可能的。 幸运的是,上下文是Rebol中的第一类对象,因此答案可能如下所示:
f: m: 0 ctx: context [
f: 4
m: 10
both: object [
m: 20
getter-code: does [print [f m]]
getter-text: does [impossible-print reduce ["f" ctx "m" self]]
]
]
impossible-print: func [vars /local r][
r: copy []
foreach [v c] vars [append r bind to-word v c]
print r
]