6

次のRebol 3コードだと思います:

x: [newline 1 2]
y: [
1 2]

print x
print new-line? x
print y
print new-line? y

出力する必要があります:

<empty line>
1 2
true
<empty line>
1 2
true

しかし、出力は次のとおりです。

<empty line>
1 2
false
1 2
true

両方のブロックを縮小すると、改行文字の後に「1」と「2」が続くため、IMO は同じように出力されるはずです。改行かどうかはあまり明確ではありませんか?この種のテストでは、newline キーワードは文字通りの改行と同等である必要があるため、2 つのブロックでも同じ結果が得られるはずです。

4

2 に答える 2

3

NEWLINEから始めましょう:は値newlineにバインドされた単語です:char!

>> ? newline
NEWLINE is a char of value: #"^/"

これは、UnicodeコードポイントU + 000Aに対するRebolのエスケープシーケンスであり、一般に改行( "LF")制御コードとして使用されます。

したがって、最初のサンプルコード[newline 1 2]は、NEW-LINE関数とは何の関係もありません。newline(a word!)、2(an integer!)、3(another )の3つの値を含むブロックを簡単に説明しますinteger!。最初の例からブロックを削減すると、、、、および:char!の3つの値の別のブロックが取得されます。integer!integer!

>> reduce [newline 1 2]
== [#"^/" 1 2]

これで、PRINTはREDUCEだけでなく、ブロック引数をREFORM(最初にREDUCE、次にFORM)します。ブロックのFORMは、要素を文字列表現に変換してから、間にスペースを入れて要素を結合します。

>> form [1 2 3]
== "1 2 3"

これらの要素をまとめると、最初の例で表示されている出力に到達する方法がようやくわかります。

>> basis: [newline 1 2 3]
== [newline 1 2 3]
>> step1: reduce basis
== [#"^/" 1 2 3]
>> step2: form step1
== "^/1 2 3"
>> print step2

1 2 3

それで、疑問が残ります、なぜ2番目の例は同じように印刷されないのですか?

これは、FORM(上記のようにPRINTで使用される)がブロックから文字列に変換するときにNEW-LINEフラグを尊重しないためです。

このフラグは「メタデータ」であり、たとえばブロック内の要素のインデックス位置とは異なります。したがって、のようなブロックを記述したという理由だけでインデックス位置8および6に要素がないのと同じよう[8 6]に、その位置に要素を配置したという理由だけで改行フラグを設定することはありません。一部のシステムでは、改行を表します[1 newline 2]

そして、これはついにパズルの最後の部分に私たちをもたらします:改行?指定された文字列が改行を表すかどうかをチェックしません。ブロック(現在の位置)に改行フラグが設定されているかどうかをチェックします。

于 2013-01-23T17:43:51.713 に答える
3

によってチェックnew-line?および設定されるフラグはnew-line、LOAD および MOLD によってのみ使用されます。プログラム内の他のすべてのセマンティック目的では、存在しない場合もあります。

したがって、あなたのxy完全に異なります。ご了承ください:

x: [newline 1 2]
y: [
1 2]

3 = length? x
2 = length? y

この 1 ビットの空白情報を取り出して隠し場所に格納するのは、Rebol の癖です。しかし、間違いなく、行を分割するという選択は、ソースでしばしば重要なことを表しています。つまり、それをテキストに反映する場合、残りの空白よりも多くを保持したいということです。

于 2013-01-23T17:32:14.373 に答える