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
.
2つのオブジェクトを比較すると、最初のものは'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
のバインディングを変更したものです。
他のヒント
バインディング情報はブロックではなく単語で搬送されます。ブロックがリバウンドすると、バインディングプロセスはブロックに含まれる単語に影響します。したがって、b/b
ブロック(in b 'b
Wordではなく)が正しくリバウンドされましたが、チェックは間違っています。以下のように、ブロック内のリバウンドワードの1つからコンテキストを取得する必要があります。
>> equal? bind? 'system bind? b/b/1
== true
.