У меня есть два макроса. Первый принимает символ как единственный параметр (потому что он передается в def, который нуждается в символе). Вторая функция принимает список символов и должна вызывать первый для каждого символа отдельно.
(defmacro m1 [s]
'(let [f# ... dynamic function definition ...]
(def ~s f#))
Второй макрос должен взять список символов и передать их первому, но я не могу заставить его работать. Лучшее, что я мог придумать, было следующее:
(defmacro m2 [symbols]
`(for [s# ~symbols] (eval (read-string (str "(name.of.current.namespace/m1 " s# ")")))))
, который заставляет s#
быть оцененным до того, как он будет передан первому макросу. Он также вызывается со списком строк, а не со списком символов.
Это полезно для библиотеки, которую я использую, для которой все функции в библиотеке принимают одинаковые два первых параметра. Я пытаюсь создать функции-оболочки в своем пространстве имен для некоторых функций, которые автоматически предоставляют первые два значения параметров, которые являются общими для всех из них.
Есть идеи по улучшению этого?