6

DO方言使用PAREN范畴系列!优先级,并且通常会在调用函数之前煮掉底层的括号结构。

但是,在 Rebol 2 中,过去可以在函数定义中指定您希望它在调用点抑制对括号的求值。您通过在参数上使用“文字”撇号标记来做到这一点:

evaluated: func [param] [probe param]

non-evaluated: func ['param] [probe param]

>> evaluated (1 + 2)
3

>> non-evaluated (1 + 2)
(1 + 2)

所以你通过了一个系列!类别类型,属于 PAREN!...在这种情况下,内部包含三个符号元素:1, +, 2. 这在 Rebol 3 中不起作用:

>> non-evaluated (1 + 2)
3

这是一个错误还是一个有目的的设计决定?有解决方法吗?请注意,将引号运算符放在调用点不起作用,因为它quote是被引用的符号词,然后是括号!自行评估以成为表达式的最终值:-/

>> non-evaluated quote (1 + 2)
quote
== 3
4

1 回答 1

7

此参数传递类型的行为已被故意更改。(包括我自己在内的许多用户都要求更改)。优点是您可以使用括号请求对该参数类型的评估(请求评估的另一种方法是使用 get-word)。如果您想要真正未经评估的参数传递,请参见:

quote: make function! [[
    "Returns the value passed to it without evaluation."
    :value [any-type!]
][
    :value
]]

与 R2 相比,这又是一个改进,在 R2 中,此类功能的行为方式并不完全相同。

如果你真的想通过一个paren!到您的函数,同时不想更改其定义以使用“真正未评估的参数传递”,您可以尝试以下操作:

non-evaluated (quote (1 + 2))
于 2013-01-26T01:29:59.530 回答