Предположим, у меня есть куча пространств имен (яблоко, банан, апельсин). В этих пространствах имен я использую макрос eat
, который вызывает (не "генерирует", вызывает ) функцию peel
. Функция peel
различна для каждого фрукта, но макросы одинаковы и довольно большие, поэтому я хотел бы создать пространство имен fruit
, содержащее макрос eat
. Но когда я вызываю макрос eat
из пространства имен apple
, макрос eat
должен вызывать функцию apple/peel
.
Для иллюстрации (но это не работает):
(ns fruit)
(defmacro eat [] (peel))
(ns apple)
(defn peel [] (prn "peeled apple"))
(fruit/eat)
(ns banana)
(defn peel [] (prn "peeled banana"))
(fruit/eat)
Чтобы подчеркнуть, это означает, что функция отслаивания должна вызываться тогда и только тогда, когда макрос раскрывается, как в этом примере.
(ns apple)
(defn peel [] (prn "peeled apple"))
(defmacro eat [] (peel))
(macroexpand-1 '(eat))
Итак, есть ли идеи о том, как сочетать макросы и полиморфизм?