了解块中的印刷品和符号之间的关系

Understanding the relationship between print and symbols held in blocks

场景一:

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

场景二:

red>> print first sizes
small

我希望场景 1 和场景 2 具有相同的行为(要么在评估时出错,要么被视为符号)。

我正在尝试了解以下情况是否特定于 print 或我应该理解的 Red/Rebol 概念。

我知道块中的所有单词都被视为符号并且需要一个函数来评估它们(如果需要)。所以场景 1 是有道理的。但是如果我们从一个块中提取一个词(使用first),它仍然是一个符号?

您的理解是正确的,这两种情况下的行为是 print 所特有的,或者更具体地说是 reduce (reduce 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

问得好!

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

答案是"both"。要理解的核心 Red/Rebol 概念是,您可以定义函数的行为,以根据传递的类型使用一种多态性进行分派。而 PRINT 目前所写的解释了一个块!参数作为一种 "print dialect"... 它在打印之前对其进行评估。如果你设法把它写下来!值,它将打印该单词的拼写。

你成功地漏了一个字!作为值而不通过从块中挑选它来评估它,所以它是一个函数的结果。评估器每次通过只需要 一个 步骤,所以在 运行 FIRST 之后,它不认为查找它是它的工作......返回的 WORD!是数据,不是代码:

red>> sizes: [small medium large]
red>> print first sizes
small

您也可以通过字面词来做到这一点,它在简化为 WORD 的那一步中具有评估者行为!并且(再次)不再进一步:

red>> print 'small
small

它也可能是 QUOTE 函数的结果,它是 "special" 因为它引用了它的参数 (参见 help quote 了解规范,this very interesting tidbit在两个不同的 "kinds of parameter quoting"...一个微妙但漂亮的区别)

red>> print quote small
small

但是参数引用是例外而不是常态。所以通常如果你看到类似 SMALL 的东西在这样的序列中没有被引用和被阻止......你期望评估者会看到它,查找它,如果找不到它就会窒息:

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 看到该块,并且对于该块的顶层,假设您想要进一步评估可以评估的内容。 (字符串文字,例如,在评估路径的尽头,对它们的评估是空操作)。除了空格和换行符,它有点像你输入的:

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

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

这让我们回到关于 "the following scenario is specific to print" 的问题。就 PRINT 选择解释块参数的方式而言,它就是如此。您可能会设想一些类似 PRINT 的东西,除非有东西在 PAREN 中,否则不会评估!阻止,或有任何其他你想要的行为......这是 "dialecting" 的关键。 (与替代提案相比,当前的 PRINT 有点简单,它所做的简单事情就是有效地减少给定的块。)

但是接受 PRINT 原样,在块外工作以欺骗评估者的相同步骤可以在这里工作。这是三种不同的方式:

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

(快速插入:这个主题的许多其他变体是可能的,并且今天在 Ren Garden 中正在实践中。它不是一个新的评估器,但它有一个新的 PRINT...那就是冰山一角...)

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

例如原则{small big large}