Reflection 为什么';你不能重新开始新的生产线吗?是否以类似方式对待换行符关键字和换行符?

Reflection 为什么';你不能重新开始新的生产线吗?是否以类似方式对待换行符关键字和换行符?,reflection,newline,rebol,Reflection,Newline,Rebol,我认为以下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 1 2 真的 1 2 真的 但输出是: <empty line> 1 2 false 1 2 true 1 2 假的 1 2 真的 两个块缩小后,应产生一个换行

我认为以下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

1 2
真的
1 2
真的
但输出是:

<empty line>
1 2
false
1 2
true

1 2
假的
1 2
真的

两个块缩小后,应产生一个换行符,后跟“1”和“2”,因此,IMO,应以相同的方式打印。不太清楚的是是否有新线?在两个块上也应给出相同的结果,因为对于此类测试,换行符关键字应等同于文字换行符。

newline?
检查并由
newline
设置的标志仅由LOAD和MOLD使用。对于程序中的所有其他语义目的,它也可能不存在

因此,您的
x
y
完全不同。请注意:

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

3 = length? x
2 = length? y

Rebol的一个怪癖是,它将这一小块空白信息单独存放在一个隐藏的地方。但可以说,断行的选择代表了一些在源代码中通常很重要的内容,如果你将其反映回文本中,你希望保留的内容比保留其余的空白更多。

让我们从新行开始:
新行
是一个绑定到
字符的单词值:

>> ? newline
NEWLINE is a char of value: #"^/"
这是Rebol对Unicode代码点U+000A的转义序列,通常用作换行(“LF”)控制代码

因此,您的第一个示例代码
[newline 1 2]
与新行函数无关。它简单地描述了一个包含三个值的块:
newline
(一个
word!
)、
2
(一个
整数!
)和
3
(另一个
整数!
)。如果从第一个示例中减少该块,将得到另一个包含三个值的块:
char
整数,和
整数

>> reduce [newline 1 2]
== [#"^/" 1 2]
现在,PRINT不仅减少了,它还改变了(首先减少,然后形成)块参数。块的形式将元素转换为字符串表示形式,然后使用空格连接这些元素:

>> 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
所以问题仍然存在,为什么第二个示例的打印方式不同

这是因为表单(如上所述,由PRINT使用)在从块转换为字符串时不遵守新行标志

该标志是“元数据”,与块中元素的索引位置类似。因此,正如仅仅因为编写了类似
[8 6]
的块,所以索引位置8和6上没有元素一样,也不会因为在某些系统中放置了一个表示换行符的元素而设置位置的新行标志:
[1换行符2]

这最后把我们带到了谜题的最后一部分:新品?不检查给定字符串是否表示换行符。它检查块(在其当前位置)是否设置了新行标志