在下面的代码中,我们可以通过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或类似的代理进行吗?
答案 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)]
内部'引用警卫'打印在作曲期间被评估,外面的一个守卫在'做,所以'得到可以获得价值。