为什么在我的Clojure代码中调用宏中的map会失败?

时间:2015-03-22 18:12:52

标签: clojure macros

我想从

转移代码
("AAA" ("BB"  11 @"XXX"))

("AAA" ("BB"  11 "YYY"))

我只想将@"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"))

但是,当我将function更改为macro时,会引发异常。

(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

我有测试map for prewalk的功能。他们俩都提出异常。 我不知道它有什么问题以及如何在宏中解决这个错误?

0 个答案:

没有答案