如何将本地上下文块绑定到Rebol2中的全局上下文?

时间:2014-02-26 22:51:50

标签: bind rebol scoping rebol2

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

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

我的错误是什么?

2 个答案:

答案 0 :(得分: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/b的块中第一个单词的绑定,这是您之前绑定的print。这个词就是你改变了b/f中的绑定。

答案 1 :(得分:4)

绑定信息由单词而非块进行。当块反弹时,绑定过程将影响块中包含的字。因此,您的b/b阻止(而非in b 'b字词)已正确反弹,但您的支票错误。您需要从块内的一个回弹字中检索上下文,如:

>> equal? bind? 'system bind? b/b/1
== true