字符串是否可以延迟绑定'就好像他们是同一个位置的单词一样?

时间:2015-08-02 06:45:06

标签: rebol scoping rebol3 red

当你加载一个字符串时,它默认偏向用户上下文:

>> 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-codegetter-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无法写入的地方,根本缺少一些东西?

1 个答案:

答案 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
]