如何在类似COMPOSE的情况下避免函数调用?

时间:2014-12-24 20:17:39

标签: function rebol rebol3

在下面的代码中,我们可以通过SET-WORD将GET-WORD的结果赋给p,然后在新名称下使用它:

p: :print 
p [{Hello} {World}]

但是,如果你正在使用COMPOSE,你会发现这样的情况呢?

do compose [p: (:print)] 
p [{Hello} {World}]

这会出错:

*** ERROR
** Script error: -unnamed- is missing its value argument
** Where: do
** Near: do compose [p: (:print)] p ["Hello" "World"]

因此它就像块中的函数值一样是" live"在翻译中看到...是否将其作为评价结果取出。 (除非以某种方式获取或应用,否则它们应该是惰性的,否则无法在COMPOSE或类似内容中进行此类分配。)

似乎你必须引用一个get-word ,例如:

do compose [p: (quote :print)] 
p [{Hello} {World}]

这可以解决打印功能问题。但是你可以不通过GET-WORD或类似的代理进行吗?

3 个答案:

答案 0 :(得分:3)

是的,您可以“撤防”有效功能!具有DO方言特征的值:

>> do probe compose [p: quote (:print)]
[p: quote make native! [[
        "Outputs a value followed by a line break."
        value [any-type!] "The value to print"
    ]]]

>> p [{Hello} {World}]                  
Hello World

这里的关键是用于QUOTE的单个参数的特殊参数传递模式:

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

这种参数传递模式,缺乏想象力地称为“获取参数”,禁止评估参数值。所以在我们的特殊情况下,它会阻止函数的“活动”性质!值得承受。

有关参数传递模式的更多详细信息,您可能需要查看最近的treatise about literal and get arguments,它将Rebol 2和Rebol 3之间的差异进行比较,以提供历史视角。

答案 1 :(得分:2)

使用以下方式创建get-word,它会为您提供额外的间接级别:

>> do compose [p: (to-get-word 'print)]
>> p [{Hello} {World}]
Hello World

如果您希望使用DO [...]表格完成作业,那么您需要为匿名函数指定一个单词,以便以被动方式对其进行操作。

另一种选择是在组合块之外进行分配:

p: first compose [(:print)]

答案 2 :(得分:0)

第一个问题是你需要什么?

因为它没有作曲。

Do [p: :print]
P 1

没有get-word

Do [p: get first [print]]

编辑:

我不明白对C ++绑定的影响,但'compose用于有选择地评估块的部分。在您的示例中,您想要评估零件,但仍希望它不被评估,因此您需要阻止它过早评估,例如:

do compose [p1: (to get-word! 'x)] 

如果你想使用compose,而没有get- / lit-word!,你可以尝试引用:

do compose [p4: get quote ( quote print)]

内部'引用警卫'打印在作曲期间被评估,外面的一个守卫在'做,所以'得到可以获得价值。