我想从
转移代码("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
的功能。他们俩都提出异常。
我不知道它有什么问题以及如何在宏中解决这个错误?