做一個命名空間限定的函數名我有一大堆的映射,並從由外部系統定義了一些代碼的功能:在宏
(defn translate-from-ib-size-tick-field-code [val]
(condp = val
0 :bid-size
3 :ask-size
5 :last-size
8 :volume))
(defn translate-to-ib-size-tick-field-code [val]
(condp = val
:bid-size 0
:ask-size 3
:last-size 5
:volume 8))
我想打一個宏來刪除重複:
#_ (translation-table size-tick-field-code
{:bid-size 0
:ask-size 3
:last-size 5
:volume 8})
我開始喜歡這個宏:
(defmacro translation-table [name & vals]
`(defn ~(symbol (str "translate-to-ib-" name)) [val#]
(get [email protected] val#)))
生成的函數體似乎是正確的,但函數名是錯誤的:
re-actor.conversions> (macroexpand `(translation-table monkey {:a 1 :b 2}))
(def translate-to-ib-re-actor.conversions/monkey
(.withMeta (clojure.core/fn translate-to-ib-re-actor.conversions/monkey
([val__10589__auto__]
(clojure.core/get {:a 1, :b 2} val__10589__auto__))) (.meta ...
我想「翻譯到IB-」顯示爲函數名稱的一部分,而不是一個前綴命名空間,因爲它橫空出世。
我該如何使用clojure宏來做到這一點?如果我只是做錯了,不應該爲此使用宏,請讓我知道,但我也想知道如何創建這樣的函數名,以提高我對clojure和宏的一般理解。謝謝!
謝謝,這正是我所尋找的兩點。 –