据我所知,您应该能够将任何块绑定到任何上下文。特别是,可以将全局上下文块绑定到本地上下文:
>> 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我的错误是什么?
发布于 2014-02-26 23:28:56
您正在绑定分配给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中更改绑定的内容。
发布于 2014-02-26 23:40:24
绑定信息是由文字而不是块携带的。当块反弹时,绑定过程将影响块中包含的单词。因此,您的b/b块(而不是in b 'b单词)已正确反弹,但您的检查是错误的。您需要从块中的一个回弹词中检索上下文,如下所示:
>> equal? bind? 'system bind? b/b/1
== truehttps://stackoverflow.com/questions/22055249
复制相似问题