3

Rebol の IN 関数は、フィールドがオブジェクト内にあるかどうかを調べます。

USAGE:
    IN object word

DESCRIPTION:
    Returns the word or block in the object's context.
    IN is a native value.

ARGUMENTS:
    object (any-object! block!)
    word -- (modified if series) (any-word! block! paren!)

主張は、それがオブジェクトまたはブロックで機能するということです。オブジェクトで試してみると問題なく動作します:

>> in object [foo: 10 bar: 20] 'foo
== foo

しかし、生のブロックで試してみると、NONE が返されます。

>> in [foo: 10 bar: 20] 'foo
== none

ブロックをサポートしていない場合は理解できると思います(Rebol2はサポートしていませんでした)。しかし、ブロックが許可されている NONE を返さない場合はどうなるでしょうか?

そして、この 2 つの質問を 1 つにする危険を冒して、BLOCK を受け入れるとはどういうことでしょう! wordパラメータの?探している単語のセットがある場合、ブロックがかかると思いますが、ブロックを返すだけのようです:

>> in object [foo: 10 bar: 20] [mumble frotz bar]
== [mumble frotz bar]

>> in object [foo: 10 bar: 20] [mumble frotz]
== [mumble frotz]

そして、この 3 つの質問をするリスクを冒してでも、PAREN を取ることに何の意味があるでしょうか! 言葉のために?

4

2 に答える 2

5

IN 関数は、主にオブジェクト内の単語を検索するためのものではなく、オブジェクト内にある単語または単語のブロック、またはオブジェクトにバインドされた Rebol 用語を返すためのものです。これは、BIND 以外のさまざまな状況で役立つ BIND 関数の変形です。

その名前の単語がオブジェクトにない場合、十分に賢明なことに、何も返されません。これにより、単語検出関数として条件式で使用できるという副次的な利点が得られますが、それは主な用途ではありません。

IN は、オブジェクト パラメーターとしてオブジェクトのブロックを取得し、単語を各オブジェクトに順番にバインドして、その単語を持つブロック内の最初のオブジェクトにバインドされた単語を返します。これは、Rebol 3 GUI の古いデザインのワード ルックアップをオーバーライドするための比較的迅速な方法として意図されていましたが、その場合は最善の方法ではないことが判明したため、GUI は現在そのデザインを使用していません。ただし、INブロック ワードは、他の場所で将来使用するための潜在的に役立つ機能として保持されていました。

あなたの例では、そのブロックにオブジェクトがなかったため、IN が単語をバインドできるものは何もありませんでした。これが、IN が何も返さなかった理由です。

word パラメーターのブロックを IN に渡すと、オブジェクトを返す前にブロックをオブジェクトにバインドします。のようなコードを許可するためですdo in obj [print a]。ただし、それは行わないbind/copyので、そのようなコードには注意する必要があります。または、INオブジェクト ブロックをコピーする必要があるかもしれません。それを変更するには遅すぎますか? word 引数に括弧を渡すと、ブロックを渡す場合と同じバインド動作が必要です。

最後に確認したとき、オブジェクトと単語の両方のパラメーターをブロックにすることはサポートされていませんでした。これは、少なくとも明らかに、その動作がどうあるべきかについての適切なモデルを理解できなかったためです。結果が決定的でないため、単語のブロックをオーバーライドする単語検索は実際には機能しません。

特にRebolの実際にはネストされていないスコープを再作成するために、ブロックを一連のオブジェクトに順番に再バインドする関数があると便利ですが、その関数がINであると本当に混乱します。

于 2014-01-11T19:52:08.537 に答える
2

これはあまり役に立たないかもしれませんが、明示的に言及されていないため、今のところ最初の質問を解決する「正しい」方法だと思います:

red>> first find [foo: 10 bar: 20] 'foo
== foo:

これはrebol2 thoでは機能しませんがquoteset-word!動作します:

>> first find [foo: 10 bar: 20] quote [foo:]
== foo:

それでも返すというわずかな欠点がありますset-word!

于 2016-10-01T23:23:50.043 に答える