为什么宏中的调用映射在我的Clojure代码中会失败?
我想把代码从为什么宏中的调用映射在我的Clojure代码中会失败?,clojure,macros,Clojure,Macros,我想把代码从 ("AAA" ("BB" 11 @"XXX")) 到 我只想把@XXX改成YYY 我写了一个函数,它可以工作 (defn tt [clause] (cond (not (sequential? clause)) clause (and (sequential? clause) (= 2 (count clause)) (= `deref (first clause))
("AAA" ("BB" 11 @"XXX"))
到
我只想把@XXX改成YYY
我写了一个函数,它可以工作
(defn tt [clause]
(cond (not (sequential? clause)) clause
(and (sequential? clause)
(= 2 (count clause))
(= `deref (first clause))
(string? (second clause)))
"YYY"
:else (map tt clause)))
我的结果是:
(tt '("AAA" ("BB" 11 @"XXX"))) --> ("AAA" ("BB" 11 "YYY"))
但当我将函数更改为宏时,它会引发异常
(defmacro test [& clause]
(let [f (fn tt [clause]
(cond (not (sequential? clause)) clause
(and (sequential? clause)
(= 2 (count clause))
(= `deref (first clause))
(string? (second clause)))
"YYY"
:else (map tt clause)))]
(f clause)))
它引发了这样的异常
(test "AAA" ("BB" 11 @"XXX")) --> ClassCastException java.lang.String cannot be cast to clojure.lang.IFn
我有预走功能的测试图。他们都提出了例外。
我不知道它出了什么问题以及如何在宏中修复此错误???如果在REPL中键入BB 11 YYY,您将看到完全相同的错误。您的宏工作正常,但clojure无法计算BB 11 YYY,因为BB不是一个函数。您的宏返回一个AAA BB 11 YYY表单,它应该是eval,但AAA不是一个函数
(test "AAA" ("BB" 11 @"XXX")) --> ClassCastException java.lang.String cannot be cast to clojure.lang.IFn