Я пытаюсь использовать макрос do-template
Стюарта внутри defprotocol
, и компилятор 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]))
Проблема (я полагаю) состоит в том, что s-выражение do-template
передается 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 ...))
и получил:
(do (clojure.core / seq (clojure.core / concat (clojure.core / list (symbol (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 (symbol (str bar "-method"))) (clojure.core /list (clojure.core / apply clojure.core / vector (clojure.core / seq (clojure.core / concat (clojure.core / list (цитирую пользователя / это)) (clojure.core / list (цитирую пользователя / это)))))))) (clojure.core / seq (clojure.core / concat (clojure.core / list (symbol (str baz "-method")))) (clojure.core / list (clojure.core / применить clojure.core / vector (clojure.core / seq (clojure.core / concat (clojure.core / list (цитирует пользователя / это))) (clojure.core / list (цитирует пользователя / это)))))))))
Не совсем легко читать: -).
Кроме того, я, вероятно, хочу, чтобы this
и that
были анафорами и разверните к себе: ~'this
.