3

map-eachコレクション内のすべてのメンバーのコードを評価し、評価の結果をブロックに集約するために使用できます。

>> values: map-each x [1 2] [
    print ["Doing mapping for" x]
    x * 10
   ]
Doing mapping for 1
Doing mapping for 2
== [10 20]

こんな感じで積み木を積み上げていました。しかし、ブロックはデフォルトでは評価されxないため、そのまま残され、必要な値が取得されないことを忘れていました。

>> blocks: map-each x [1 2] [
    print ["Doing mapping for" x]
    [x * 10]
   ]
Doing mapping for 1
Doing mapping for 2
== [[x * 10] [x * 10]]

そこに驚きはありません。評価後はx価値がなくなります。ましてや、多くの値を取る能力はありません。

>> probe x
** Script error: x has no value

手遅れなので、評価は map-each の本体内で REDUCE または COMPOSE を使用して行う必要があります。しかし...

>> reduce first blocks
== [20]

>> reduce second blocks
== [20]

結果ブロック内のアイテムの評価はエラーをスローしませんがx、最後の反復の値があるかのように動作します。

これはどのように行われていますか?これを行う必要がありますか?

4

2 に答える 2

3

'FOREACH と同様に、'MAP-EACH は、作成したコンテキスト内で指定したブロックをバインドし、そこで実行します。

X がグローバルに作成されることはありません。引数として単語(そしてリットワードではない)を与えたという事実は、おそらくリットワード表記を使用する関数のインターフェースによって管理され、代わりに与えられたそのままの評価されていない単語を使用します含まれる可能性のある値。

このため、 map-each への呼び出しで使用される X はトリガーしません

** Script error: x has no value

map-each は評価される前にそれを取得し、単語をトークンとして直接使用するだけなので。

結合がどのようにより鮮明に機能するかを説明し、'X が元のコンテキストを超えて存続する可能性があることを示すために、Rebol で単語が結合される方法の基礎 (およびこの結合が持続するという事実) を示す例を次に示します。

この例を見てください:

a: context [x: "this"]  
b: context [x: "is"]  
c: context [x: "sensational!"]

>> blk: reduce [in a 'x   in b 'x   in c 'x]
== [x x x]

x: "doh!"
== "doh!"

>> probe reduce blk
["this" "is" "sensational!"]

3 つの 'X ワードを含む 1 つのブロックを作成しましたが、同じコンテキストにバインドされたものはありません。

Rebol のバインディングは静的であり、スコープが存在しないため、同じコンテキスト (この場合、コンソールはグローバル | ユーザー コンテキスト) で操作されている場合でも、同じ単語が異なる値を持つ可能性があります。

これは、単語が Rebol の変数ではない理由の最後から 2 番目の例です。

于 2014-05-22T14:11:53.390 に答える
3
blocks: map-each x [1 2] [
    print ["Doing mapping for" x]
    [x * 10]
]

probe bound? first blocks/1

これを与える

Doing mapping for 1
Doing mapping for 2
make object! [
    x: 2
]
于 2014-05-15T02:01:09.107 に答える