You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Red语言中compose与compose/deep在parse规则中的使用及(print text)保留方法

解决Red语言中Compose构建Parse规则时print语句消失的问题

为什么print text会消失?

当你用compose生成Parse规则时,括号(...)包裹的表达式会被立即求值,结果会替换掉原位置的括号内容。而print语句执行后返回的是none,所以compose处理后,规则里的(print text)就变成了none——Parse规则会自动忽略none值,导致你的打印语句看起来"消失"了。

核心思路:让动作代码保留到Parse执行时再运行

我们需要让compose把print text作为字面量代码块插入规则,而不是提前执行它。这里用quote来包裹动作语句是最直接的方法:quote (print text)会被compose求值为(print text)本身,完美保留在规则里。


普通compose的修正示例

s: {hello test1 parse test2} 
t1: "test1" 
t2: "test2" 
rule: compose [ thru (t1) mark: copy text to (t2) (quote (print text))]
parse s rule

运行后会正确打印出t1和t2之间的内容:parse。


compose/deep的适配方案

compose/deep会递归展开所有嵌套块里的括号,但问题本质和普通compose一致——不能让print text被提前求值。同样用quote包裹即可:

s: {hello test1 parse test2. hello second test for test1 parse test2.} 
t1: "test1" 
t2: "test2" 
rule: compose/deep [ any [thru (t1) mark: copy text to (t2) (quote (print text))]]
parse s rule

这个版本会匹配到两处符合规则的内容,分别打印两次parse。


小提示

别尝试用双重括号((print text))来绕开——内层的(print text)还是会被提前求值为none,最终规则里还是留不下有效的动作代码。quote是最可靠的方式,确保你的打印逻辑在Parse执行时才会触发。

内容的提问来源于stack exchange,提问作者user310291

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.28 09:42:51