3

Scenario 1:

red>> sizes: [small medium large]
== [small medium large]
red>> print sizes
*** Script error: small has no value
*** Where: print

Scenario 2:

red>> print first sizes
small

I expected scenarios 1 and 2 to have the same behaviour(either error out on evaluation or be treated as a symbol).

I am trying to understand if the following scenario is specific to print or a Red/Rebol concept that I should understand.

I understand that all words in a block are treated as symbols and a function is required to evaluate them(if necessary). So scenario 1 makes sense. But if we extract a word from a block(using first), it remains a symbol?

4

3 回答 3

4

您的理解是正确的,并且这两种情况下的行为特定于print,或者更特别的是reduce(reduce是评估的替代方法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
于 2015-04-19T18:06:47.070 回答
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规范,以及关于两种不同“类型参数引用”的这个非常有趣的花絮......一个微妙但漂亮的区别)

red>> print quote small
small

但是参数引用是例外而不是常态。因此,通常如果您在这样的序列中看到类似 SMALL unquoted and unblocked 之类的东西……您希望评估者会看到它,查找它,如果找不到它就会窒息:

red>> print small
*** Script error: small has no value

因为 PRINT 在通过 BLOCK 时做出的决定!是评估该块并合并评估结果,当您编写时:

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 看到该块,并且对于该块的顶级假设您想要进一步评估 that-which-can-be-evaluated。 (例如,字符串文字位于评估路径的末尾,并且对它们的评估是无操作的)。除了间距和换行符,它有点像你输入的:

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

(当然,除了它在第一个错误时停止。)

这让我们回到了“以下场景是否特定于打印”的问题。它就是 PRINT 选择解释块参数的方式。您可能会设想一些类似 PRINT 的东西,除非某些东西在 PAREN 中,否则它不会评估!阻止,或有任何其他你想要的行为......这是“方言”的关键。(与其他提议相比,当前的 PRINT 有点简单,它所做的简单事情就是有效地减少给定的块。)

但是接受 PRINT as-is 的步骤与在块外用于欺骗评估者的步骤相同,可以在这里工作。以下是三种不同的方式:

red>> print ['small quote medium third [small medium large]]
small medium large

(快速插入:这个主题的许多其他变化是可能的,并且在今天的仁园实践中。它不是一个新的评估器,但它有一个新的打印......这只是冰山一角......)

于 2015-04-19T18:27:16.683 回答
0

如果要打印尚未定义的字符串块,最好使用这些“{}”括号。打印/打印功能在不评估的情况下打印它。

例如prin {small big large}

于 2015-08-26T14:10:31.123 回答