为什么Rebol 3没有引用带括号的引用函数参数?

Hos*_*ork 6 reflection rebol rebol3 symbolic-computation

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)
Run Code Online (Sandbox Code Playgroud)

所以你通过了系列!分类型,类PAREN的......在这种情况下,与内部的三个标志性元素:1,+,2.这在Rebol 3中不起作用:

>> non-evaluated (1 + 2)
3
Run Code Online (Sandbox Code Playgroud)

这是一个错误还是一个有目的的设计决定?有解决方法吗?请注意,将引号操作符放在callsite上是行不通的,因为它是quote引用的符号词,然后是paren!得到自己的评估,成为表达式的最终值: - /

>> non-evaluated quote (1 + 2)
quote
== 3
Run Code Online (Sandbox Code Playgroud)

Lad*_*lav 7

此参数传递类型的行为已故意更改.(包括我在内的许多用户都要求进行更改).优点是您可以使用括号请求对此参数类型进行评估(另一种如何请求评估的方法是使用get-word).如果你想要真正无价值的参数传递,请看:

quote: make function! [[
    "Returns the value passed to it without evaluation."
    :value [any-type!]
][
    :value
]]
Run Code Online (Sandbox Code Playgroud)

与R2相比,这再次是一种改进,在这种情况下,这种功能的行为并不完全相同.

如果你真的想通过一个paren!对于你的函数而不想改变它的定义以使用"真正无价值的参数传递"你可以试试这个:

non-evaluated (quote (1 + 2))
Run Code Online (Sandbox Code Playgroud)