Clojure 语法引用宏中重复出现的参数计数不匹配
我正在创建一个宏,它将接受中缀表示法中的和,并返回前缀表示法中的等效列表。虽然代码在逻辑上可能还不正确,但我在调用宏时遇到了以下错误:Clojure 语法引用宏中重复出现的参数计数不匹配,clojure,macros,Clojure,Macros,我正在创建一个宏,它将接受中缀表示法中的和,并返回前缀表示法中的等效列表。虽然代码在逻辑上可能还不正确,但我在调用宏时遇到了以下错误: CompilerException java.lang.IllegalArgumentException:要恢复的参数计数不匹配,应为:0个参数,got:5,编译:(/tmp/form-init1201331851685991945.clj:1:1) 以下是宏的代码: (defmacro infixer [o1 outlist i1 i2 i3] `(if
CompilerException java.lang.IllegalArgumentException:要恢复的参数计数不匹配,应为:0个参数,got:5,编译:(/tmp/form-init1201331851685991945.clj:1:1)
以下是宏的代码:
(defmacro infixer [o1 outlist i1 i2 i3]
`(if (empty? ~i3)
(concat ~i1 ~i2)
(if (= ~i2 ~o1)
;then recur list of i2 i1 i3 at outlist tail
(recur ~o1
(concat ~outlist (~i2 ~i1 ~(first i3)))
()
~(second i3)
~(rest (rest i3)))
;else recur i1 at outlist tail
(recur ~o1
(concat ~outlist ~i1)
~i2
~i3
~(rest i3)
))))
我使用以下方法对其进行测试,然后抛出上述错误:
(def s1 '(1 + 3 * 2 / 2 * 5 - 3))
(infixer * () (first s1)(second s1)(rest (rest s1)))
我看不到任何recur
目标,所以recur
不应该看到宏名称后面的五个参数吗?我以前没有使用过语法引用,所以我怀疑我误解了如何使用它。有人能解释一下为什么会抛出错误吗
此外,如果我在尝试将中缀转换为前缀的逻辑上有点偏离,请随意为我指出正确的方向!我是Clojure和FP的新手,因此非常感谢您的指导-提前感谢。如果您从另一个函数调用此宏,那么
recur
将是该函数的递归点,因为您不能在宏中使用recur
(据我所知)。仅将recur
替换为infixer
(以递归方式生成宏)应该会带来一些麻烦尝试以递归方式编写宏尾是可能的,但通常不是正确的方法(仅替换recur
不会解决问题)。相反,请参阅类似的内容,了解编写递归中缀宏的正确方法。