【发布时间】:2011-09-18 03:23:39
【问题描述】:
我正在尝试在 defprotocol 中使用 Stuart Sierra 的 do-template 宏,而 Clojure 编译器抱怨我正在重新定义 do-template——这不是我想要的:
(defprotocol AProtocol
(a-method [_])
(do-template [name]
`(~(symbol (str name "-method")) [this that])
foo
bar
baz))
这应该扩展为:
(defprotocol AProtocol
(a-method [_])
(foo-method [this that])
(bar-method [this that])
(baz-method [this that]))
问题(我相信)是do-template s 表达式被传递给defprotocol 未扩展。有什么办法让它在通过之前进行评估?
顺便说一句,do-template 实际上应该扩展到
(do
(foo-method [this that])
(bar-method [this that])
(baz-method [this that]))
但我已经尝试过(使用手动扩展版本)并且defprotocol 可以使用嵌套的do。
如何查看do-template 的实际扩展?我尝试了(macroexpand '(do-template ...)) 和(macroexpand-1 '(do-template ...)) 并得到了:
(做 (clojure.core/seq (clojure.core/concat (clojure.core/list (符号 (str foo “-方法”)))(clojure.core/list (clojure.core/apply clojure.core/vector (clojure.core/seq (clojure.core/concat (clojure.core/list(引用用户/this)) (clojure.core/list(引用 用户/那个))))))))(clojure.core/seq (clojure.core/concat (clojure.core/list (符号 (str bar “-方法”)))(clojure.core/list (clojure.core/apply clojure.core/vector (clojure.core/seq (clojure.core/concat (clojure.core/list(引用用户/this)) (clojure.core/list(引用 用户/那个))))))))(clojure.core/seq (clojure.core/concat (clojure.core/list (符号 (str baz) “-方法”)))(clojure.core/list (clojure.core/apply clojure.core/vector (clojure.core/seq (clojure.core/concat (clojure.core/list(引用用户/this)) (clojure.core/list(引用 用户/那个))))))))))
不太容易阅读:-)。
另外,我可能希望this 和that 成为照应并扩展到它们自己:~'this。
【问题讨论】: