理解块中保存的打印和符号之间的关系

时间:2015-04-19 17:07:15

标签: rebol red

情景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),它仍然是一个符号?

3 个答案:

答案 0 :(得分:4)

您的理解是正确的,两种情况下的行为特别针对print,尤其是reducereduce is an alternate method of evaluation to do)。 print基本上是一个三步流程:reduceform,然后将结果字符串发送到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}