4

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

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

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

那么必须可以将本地上下文块绑定到全局上下文吗?但是我的尝试没有成功:

>> 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

我的错误是什么?

4

2 回答 2

4

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

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

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

问题是块并没有真正绑定,块中的单词是绑定的。块本身没有任何绑定,甚至作为一个概念也没有。此外,分配给的块b/b只是一个碰巧分配给的值,而b/b不是单词'b

这种比较应该有效:

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

您与之比较的是分配给 的块中第一个单词的绑定b/bprint即您之前绑定的绑定。那个词就是你改变了 in 的绑定b/f

于 2014-02-26T23:28:56.967 回答
4

绑定信息是由单词而不是块来承载的。当一个块被反弹时,绑定过程会影响块中包含的单词。所以你的b/b块(而不是in b 'b单词)已经正确反弹,但你的检查是错误的。您需要从块内的反弹词之一中检索上下文,如下所示:

>> equal? bind? 'system bind? b/b/1
== true
于 2014-02-26T23:40:24.097 回答