Clojure макро нуб здесь. У меня есть функция с некоторыми необязательными параметрами, например
(defn mk-foo [name & opt]
(vec (list* name opt)))
давая это:
user> (mk-foo "bar" 1 2 3)
["bar" 1 2 3]
Я пытаюсь написать макрос, который принимает те же необязательные аргументы и передает их прозрачно для вызова mk-foo
. Пока у меня есть это:
(defmacro deffoo [name & opt]
`(def ~name ~(apply mk-foo (str name) opt)))
, который имеет желаемый эффект:
user> (macroexpand '(deffoo bar 1 2 3))
(def bar ["bar" 1 2 3])
Использование apply
для выравнивания списка opt
кажется неуклюжим. Есть ли идиоматический способ сделать это? Я предполагаю, что ~@
необходим, но я не могу правильно процитировать цитату. Большое спасибо.