如何在 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
我这里的错误是什么?
解决方案
您正在绑定分配给的块中的单词 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
.
其他提示
绑定信息由单词携带,而不是块。当块反弹时,绑定过程将影响块中包含的单词。因此,您的b/b
块(而不是in b 'b
Word)已正确反弹,但您的检查是错误的。您需要从块内的一个反弹单词中检索上下文,如:
>> equal? bind? 'system bind? b/b/1
== true
. 不隶属于 StackOverflow