練習のために、私は定義しました
(defmacro quote-paren
"body -> `(body)"
[& body]
`(~@body))
期待される変換(quote-paren body)
=> ``(body)` を持っています。いくつかの基本的なテストを満たしているようです。
user=> (macroexpand-1 `(quote-paren 3 4 5))
(3 4 5)
user=> (macroexpand-1 `(quote-paren println "hi"))
(clojure.core/println "hi")
user=> (macroexpand-1 `(quote-paren (println "hi")))
((clojure.core/println "hi"))
ただし、この do-while マクロでテストしてきました (ここから変更):
(defmacro do-while
[test & body]
(quote-paren loop []
~@body
(when ~test
(recur))))
(def y 4)
(do-while (> y 0)
(def y (dec y)))
しかし、結果は
IllegalStateException Attempting to call unbound fn: #'clojure.core/unquote-splicing clojure.lang.Var$Unbound.throwArity (Var.java:43)
私が見る限り、`quote-paren' マクロは ( ~@body プラグインで) 正常に動作するため、これは理解できません:
user=> (macroexpand-1
`(quote-paren loop []
(def y (dec y))
(when ~test
(recur))))
(clojure.core/loop [] (def user/y (clojure.core/dec user/y)) (clojure.core/when #<core$test clojure.core$test@1f07f672> (recur)))
しかし、マクロ展開しようとするとdo-while
" unbound fn
" が発生します。私が見逃している微妙なものはありますか?