情景1:
red>> sizes: [small medium large]
== [small medium large]
red>> print sizes
*** Script error: small has no value
*** Where: print
情景2:
red>> print first sizes
small
我预计方案1和2具有相同的行为(评估时出错或被视为符号)。
我试图了解以下场景是否特定于print
或Red / Rebol概念,我应该理解。
我知道块中的所有单词都被视为符号,并且需要一个函数来评估它们(如果需要)。因此情景1是有道理的。但是如果我们从一个块中提取一个单词(使用first
),它仍然是一个符号?
答案 0 :(得分:4)
您的理解是正确的,两种情况下的行为特别针对print
,尤其是reduce
(reduce
is an alternate method of evaluation to do
)。 print
基本上是一个三步流程:reduce
,form
,然后将结果字符串发送到system/ports/output
。
>> message: "Hello"
== "Hello"
减少message
:
>> reduce message
== "Hello"
减少阻止:
>> reduce [message]
== ["Hello"]
缩小'message
(评估为单词message
):
>> reduce 'message
== message
缩小first [message]
(评估为单词message
):
>> reduce first [message]
== message
在您的方案中,您可以通过预先减少块来避免评估:
>> reduce form [small medium large]
== "small medium large"
>> print form [small medium large]
small medium large
答案 1 :(得分:1)
好问题!
我试图了解以下场景是否特定于打印或我应该理解的Red / Rebol概念。
答案是“两个”。要理解的核心Red / Rebol概念是,您可以根据传递的类型定义函数的行为以使用一种多态性进行调度。当前编写的PRINT解释了一个块!参数作为一种“印刷方言”......它在印刷前进行评估。如果你设法把它弄成一个字!值,它将打印该单词的拼写。
你设法滑了一个字!作为值而不通过从块中选择它来评估它,因此它是函数的结果。评估者在每次传递时只执行一个步骤,因此在运行FIRST之后,它不认为查找它是它的工作...返回的WORD!是数据,而不是代码:
red>> sizes: [small medium large]
red>> print first sizes
small
你也可以通过一个字面词来完成这一点,它在减少为WORD的单一步骤中具有评估者行为!并且(再次)不再进一步:
red>> print 'small
small
它也可能是QUOTE函数的结果,它是“特殊的”,因为它引用了它的参数(参见help quote
表示规范,this very interesting tidbit表示两种不同的“参数引用“......一个微妙而又漂亮的区别”
red>> print quote small
small
但参数引用是异常而不是标准。所以通常情况下,如果你看到类似SMALL的未引用和未阻塞的东西......你希望评估者会看到它,查找它,并且如果它找不到它就会窒息:
red>> print small
*** Script error: small has no value
因为在传递BLOCK时PRINT决定了!当你写下:
时,要评估该块并合并评估结果red>> sizes: [small medium large]
red>> print sizes
*** Script error: small has no value
...因为PRINT没有引用它的参数,所以评估使得它有效地等同于你写的:
red>> print [small medium large]
*** Script error: small has no value
PRINT看到该块,并且该块的顶层假定您想要评估那个可以进一步评估的块。 (例如,字符串文字位于评估道路的末尾,对它们的评估是无操作的)。除了间距和换行符之外,它有点像你输入的内容:
red>> print small
*** Script error: small has no value
red>> print medium
*** Script error: medium has no value
red>> print large
*** Script error: large has no value
(当然,除非它在第一个错误时停止。)
这让我们回到了关于if “以下场景是否特定于打印”的问题。就像PRINT选择解释块参数一样。您可能会想到一些PRINT就像没有评估的东西,除非在PAREN中有什么东西!阻止,或者有你想要的任何其他行为......这是“辩证”的关键。 (与其他提案相比,当前PRINT有点过分简单,它所做的简单事情就是有效地减少它给出的块。)
但是接受PRINT就像 - 在一个块之外工作以欺骗评估者的步骤可以在这里工作。这有三种不同的方式:
red>> print ['small quote medium third [small medium large]]
small medium large
(快速插件:关于这个主题的许多其他变体是可能的,并且今天在Ren Garden实践中。它不是一个新的评估者,但它有一个新的PRINT ......这就是冰山...)
答案 2 :(得分:0)
如果要打印未定义的字符串块,最好使用这些“{}”括号。打印/打印功能无需评估即可打印。
E.g prin {small big large}