为什么宏中的调用映射在我的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