gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-02 00:15:44 24 4
gpt4 key购买 nike

在下面的代码中,我们可以通过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"]

因此,当在解释器中看到时, block 中的函数值就像是“实时”的......无论它们是否作为评估结果获取。 (看起来它们应该是惰性的,除非以某种方式获取或应用,否则不可能从 COMPOSE 或类似的内部进行此类分配。)

看来你必须引用一个get-word,例如:

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

这可以使 p 成为打印函数。但是您可以在不通过 GET-WORD 或类似代理的情况下完成此操作吗?

最佳答案

是的,您可以“解除”事件功能!具有 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
]]

这种参数传递模式,毫无想象力地称为“获取参数”,它禁止对参数值进行求值。因此,在我们的特殊情况下,它阻止了函数的“主动”性质!具有的值(value)。

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

关于function - 如何避免类似 COMPOSE 的情况下的函数调用?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27641809/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com