Макрос выпускается в два раза:
1) Вы используете обратную кавычку при цитировании формы, переданной macroexpand
, в которой пространство имен квалифицирует символы внутри:
`(translation-table monkey {:a 1 :b 2})
=> (foo.bar/translation-table foo.bar/monkey {:a 1, :b 2})
где foo.bar
- это любое пространство имен, в котором вы находитесь.
2) Вы создаете имя элемента defn
, используя символ name
, который, когда он квалифицирован пространством имен, будет преобразован в "foo.bar/monkey". Вот версия, которая будет работать:
(defmacro translation-table [tname & vals]
`(defn ~(symbol (str "translate-to-ib-" (name tname))) [val#]
(get ~@vals val#)))
Обратите внимание, что мы получаем имя tname
без части пространства имен, используя функцию name
.
Что касается того, является ли макрос здесь правильным решением, вероятно, нет :-) Для простого случая, подобного этому, я мог бы просто использовать карты:
(def translate-from-ib-size-tick-field-code
{0 :bid-size
3 :ask-size
5 :last-size
8 :volume})
;; swap keys & vals
(def translate-to-ib-size-tick-field-code
(zipmap (vals translate-from-ib-size-tick-field-code)
(keys translate-from-ib-size-tick-field-code)))
(translate-from-ib-size-tick-field-code 0)
=> :bid-size
(translate-to-ib-size-tick-field-code :bid-size)
=> 0
Если скорость важна, проверьте case
.