ReBol2のグローバルコンテキストにローカルコンテキストブロックをバインドする方法は?

StackOverflow https://stackoverflow.com//questions/22055249

  •  21-12-2019
  •  | 
  •  

質問

私が理解しているように、あなたは任意のブロックを任意のコンテキストにバインドすることができると思います。特に、グローバルコンテキストブロックをローカルコンテキストにバインドできます。

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

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top