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
相关产品推荐
相关产品推荐

