【问题标题】:How to bind local context block to global context in Rebol2?如何将本地上下文块绑定到 Rebol2 中的全局上下文?
【发布时间】:2014-02-26 22:51:49
【问题描述】:

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

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

我的错误是什么?

【问题讨论】:

    标签: bind rebol scoping rebol2


    【解决方案1】:

    您正在绑定分配给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中改变的绑定。

    【讨论】:

      【解决方案2】:

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

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2012-12-08
        • 1970-01-01
        • 1970-01-01
        • 2018-11-25
        • 2016-11-04
        • 2014-01-08
        • 1970-01-01
        • 2016-10-11
        相关资源
        最近更新 更多