1

次の点を考慮してください。

>> bin: to-binary {Rebol}
== #{5265626F6C}

>> parse/all bin [s: to end]
== true

sバイナリ シリーズの先頭をキャプチャし、BINARY! 型であると予想します。Rebol 3 では次のようになります。

>> type? s
== binary!

>> s == bin
== true

Rebol 2 では、解析によってデータが文字列に変換されている必要があるようです (または、少なくともバイナリを文字列として "イメージ化" している必要があります! 内部では、等しい比較ではありません)。

>> type? s
== string!

>> s == bin
== false

Rebol 2 は Unicode ではないため、バイナリ バイト文字列と文字列は基本的に同等です。しかし、Rebol 3 の Unicode では、次のように記述した場合、非常に異なる動作になる可能性があると思います。

parse/all to-string bin [s: to end]

複数のバイトシーケンスを文字列エンコーディングに解釈し始めるため、本当に必要なものが未解釈のバイトである場合は機能しません。:-(

BINARY! の解析において、Rebol 2 または Rebol 3 のどちらでも同じように機能するコードを書きたい場合、これをどのように回避しますか? (もちろん、Rebol 2 を 3 のように機能させるのが理想的です。)

4

2 に答える 2

2

実際、Rebol 2 は実際には、データを STRING として「イメージ化」しているだけです! コピーしない場合は、次のことに注意してください

>> bin: to-binary {Rebol}
== #{5265626F6C}

>> parse bin [s: (clear s)] 
== true

>> s
== ""

>> bin
== #{}

これは、Rebol 2 には、文字列データをバイナリとして、またはその逆にエイリアシングするためのルーチンがあったためです: AS-BINARYおよびAS-STRING。TO-BINARY および TO-STRING バリアントとは異なり、実際にはデータのコピーを作成しません。

ここに、あなた(うーん、まあ、私)が試すことができる1 つのアイデアがあります... 互換性関数を作成します (それを と呼びましょうbin-pos):

bin-pos: func [pos [binary! string!]] [
    return either string? pos [
        ;; we must be using r2, image the parse position back to binary
        as-binary pos
    ] [
        ;; just a no-op in r3, binary parse input yields binary parse positions
        pos
    ]
]

したがって、上記の例では、Rebol 2 では正しいことが起こりsますbin-pos s

>> type? (bin-pos s)
== binary!

>> (bin-pos s) == bin
== true

COPY 方言の単語を使用して新しい文字列を作成する場合、同じ手法が機能しますが、おそらく別のラッパー名を使用する必要があります。 bin-capture?

于 2013-01-07T20:21:06.843 に答える
0

キャプチャされたデータがbinary!次のようになるように、解析アクションをルールに追加するだけです。

>> bin: to binary! {Rebol}

>> parse/all bin [s: to end (s: to binary! s)]

>> type? s
== binary!

ensure-binaryドキュメントの目的で、この変換をヘルパーでラップできます。

(あなたの答えの最後の段落を正しく理解している場合、これは基本的にあなたがそこで提案するものです。ただし、なしで作成されたキャプチャにもこのアプローチを使用できると思いますcopy。)

于 2013-01-07T21:44:32.520 に答える