1

Rebol の INTO を使用すると、パーサーは一連の型 (BLOCK! や PAREN! など) に降りて、ブロックの内容に一致ルールを適用できます。Rebol 3 の簡単な例を次に示します。

data: [(a b)]

parse data [into [pos: 'a 'b (
    probe pos
    either pos = (first data) [
        print rejoin ["equal to original " mold first data]
    ] [
        print rejoin ["not equal to original " mold first data]
    ]
)]]

ブロック内の唯一のものは括弧で囲まれたシリーズであるため、INTO ルールはすぐに一致します。SET-WORD! を使用して、パーサーは の括弧に入ると位置を取得するように指示されposます。A と B はリテラルの LIT-WORD! として一致し、その後のコードが実行されます。期待される結果が発生します。

(a b)
equal to original (a b)

それは素晴らしいことです。しかし奇妙なことに、Rebol 2 は同じコードの括弧をブロックに変換します。

[a b]
not equal to original (a b)

data: [a/b]入力が次の場合、同じブロック変換が発生します。

[a b]
not equal to original a/b

なぜこれが起こるのですか?Rebol 2 を使用している場合、Rebol 3 の動作を取得する方法はありますか?

4

1 に答える 1

2

これは、カールが R2 で「奇妙な」と感じたプロパティです。したがって、彼は R3 でそれをより期待できる動作に置き換えました。不思議なことに、その方法で取得したブロックは、括弧と同じです! (内容を変更してみてください)が、別の型を持つと宣言しています。ただし、R2 で括弧を参照する必要がある場合は、コードを簡単に調整できます。

data: [(a b)]

parse data [pos: into ['a 'b (
    pos: first pos
    probe pos
    either pos = (first data) [
        print rejoin ["equal to original " mold first data]
    ] [
        print rejoin ["not equal to original " mold first data]
    ]
)]]

望ましい結果が得られる別の変更:

data: [(a b)]
parse data [set pos into ['a 'b] (
    probe pos
    either pos = (first data) [
        print rejoin ["equal to original " mold first data]
    ] [
        print rejoin ["not equal to original " mold first data]
    ]
)]
于 2013-01-25T18:40:15.997 に答える