bind - 如何在 Rebol2 中将本地上下文 block 绑定(bind)到全局上下文?

标签 bind rebol scoping rebol2

据我了解,您应该能够将任何 block 绑定(bind)到任何上下文。特别是,您可以将全局上下文 block 绑定(bind)到本地上下文:

>> a: context [
    print: does [rebol/words/print "yeah!"]
    f: func[b] [do bind b 'print]
]

>> a/f [print "hello"]
yeah!
== "hello"

所以也一定可以将本地上下文 block 绑定(bind)到全局上下文吗?但我的尝试没有成功:

>> b: context [
    b: [print "hello"]
    print: does [rebol/words/print "yeah!"]
    f: func[] [do bind b 'system]
]

>> b/b
== [print "hello"]

>> do b/b
yeah!
== "hello"

>> b/f
hello

>> do b/b
hello

看来我做到了,但是:

>> equal? bind? 'system bind? in b 'b
== false

>> same? bind? in b 'f bind? in b 'b
== true

我的错误是什么?

最佳答案

您正在绑定(bind)分配给 b/b 的 block 中的单词,而不是绑定(bind)单词 b 本身。

>> equal? bind? 'system bind? in b 'b
== false

这会比较两个对象,第一个是 'system 绑定(bind)到的对象,第二个是 in b 'b 绑定(bind)到的对象(顶级 b 对象)。

问题是 block 并没有真正绑定(bind), block 中的单词是绑定(bind)的。这些 block 本身没有任何绑定(bind),甚至作为一个概念也没有。另外,分配给 b/b 的 block 只是恰好分配给 b/b 的值,而不是单词 'b.

这个比较应该有效:

>> equal? bind? 'system bind? first get in b 'b
== true

您要与此比较的是分配给 b/b 的 block 中第一个单词的绑定(bind),即您之前绑定(bind)的 print。该单词就是您在 b/f 中更改绑定(bind)的内容。

关于bind - 如何在 Rebol2 中将本地上下文 block 绑定(bind)到全局上下文?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22055249/

相关文章:

javascript - 绑定(bind)范围 javascript

javascript - jQuery off() 在使用 bind 时不是取消绑定(bind)事件

javascript - 如果jquery live event代码已被删除,我还需要解绑它吗?

c++ - 如何使用 std::bind?

binding - 关于Rebol 2和3之间的绑定(bind)行为差异的总结是什么?

rebol - REBOL 中的多行语句?

c - 模块化C代码有哪些方法?

javascript - 属性更改后重新将 jquery 插件绑定(bind)到选择器?

string - Rebol cd 不需要%?

linux - 来自另一个函数的变量不可见?