【发布时间】:2015-05-06 20:12:46
【问题描述】:
代码如下:
(defmacro cond2 [& body]
(when body
`(if ~(first body)
~(if (next body)
(second body)
(throw (IllegalArgumentException. "error")))
~(cond2 (next (next (body)))))))
(cond2 (> 2 1) (println "2 > 1")
:else (println "2 <= 1"))
我收到了这个错误:
CompilerException java.lang.ClassCastException: clojure.lang.ArraySeq cannot be cast to clojure.lang.IFn, compiling:(/Users/personal_config_bin_files/workspace/cina/src/cina/ref_types.clj:1:24)
如果我删除递归部分,错误就会消失:
(defmacro cond2 [& body]
(when body
`(if ~(first body)
~(if (next body)
(second body)
(throw (IllegalArgumentException. "error")))
)))
当然,这只适用于有两个子句的主体。
如果我这样引用递归部分:
(defmacro cond2 [& body]
(when body
`(if ~(first body)
~(if (next body)
(second body)
(throw (IllegalArgumentException. "error")))
`(cond2 ~(next (next body))))))
然后我得到一个不同的错误:
CompilerException java.lang.RuntimeException: No such var: cina.ref-types/body, compiling:(/Users/personal_config_bin_files/workspace/cina/src/cina/ref_types.clj:331:5)
使用 cons 代替 syntax-quote 有效:
(defmacro cond2 [& body]
(when body
`(if ~(first body)
~(if (next body)
(second body)
(throw (IllegalArgumentException. "error")))
~(cons 'cond2 (next (next body))))))
(cond2 (> 2 3) (println "good")
:else (println "bad"))
但我不知道有什么区别。谁能解释一下?
【问题讨论】: