Применение макроса к форме без определения макроса - PullRequest
4 голосов
/ 09 мая 2011

Есть ли способ расширить макрос, не определяя его на самом деле? Моя ситуация такова, что у меня есть куча макросов, которые могут / не могут переопределять макросы clojure, мне нужно применить эти макросы к списку s-выражений?

Ответы [ 2 ]

4 голосов
/ 09 мая 2011

Macroexpand не может видеть макросы, представленные macrolet.Они существуют только во время компиляции, а macroexpand (при непосредственном вызове) работает во время выполнения.Ваш тест работает только потому, что вы определили when так же, как и clojure.core.Но macrolet решит вашу проблему, если вы не хотите расширяться во время выполнения.

2 голосов
/ 09 мая 2011

Копаясь в contrib, нашел то, что искал,


(use ' clojure.contrib.macro-utils)
(macrolet [(when [test & body]
             (list 'if test (cons 'do body)))]

          (macroexpand '(when true 4)))

(if true (do 4))
...