Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/typo3/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Clojure 语法引用宏中重复出现的参数计数不匹配_Clojure_Macros - Fatal编程技术网

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
不会解决问题)。相反,请参阅类似的内容,了解编写递归中缀宏的正确方法。