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

これは 2 つのオブジェクトを比較します。1 つ'system目はバインドされているオブジェクトで、2 つ目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-26T23:28:56.967 に答える
4

バインディング情報は、ブロックではなく、ワードで運ばれます。ブロックが再結合されると、結合プロセスはブロックに含まれる単語に影響します。したがって、b/bブロック (in b 'b単語ではない) は正しくリバウンドされていますが、チェックは間違っています。次のように、ブロック内のリバウンド単語の 1 つからコンテキストを取得する必要があります。

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