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