了解块中的印刷品和符号之间的关系
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
本质上是一个三步过程: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
问得好!
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}
场景一:
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
本质上是一个三步过程: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
问得好!
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}