2016-12-01 33 views
1

我與clojure.spec嘗試,我想我會寫一個宏來節省一些繁瑣的打字:-)clojure:我如何將一個名稱空間作爲宏參數傳遞?

我試圖做到這一點:

(defmacro nup 
    [pns pname punit] 
    `(s/def :~pns/name (s/and #(string? %) #(= % ~pname))) 
    `(s/def :~pns/unit (s/and #(string? %) #(= % ~punit)))) 

我試過幾個版本,但我不能使名稱空間替換工作。有任何想法嗎?不用說,宏不是我的強項。

+0

你不需要任何一個宏,只需在函數中執行's/def'即可。 – ClojureMostly

回答

1

你去那裏:

(defmacro nup 
    [pns pname punit] 
    `(do 
    (s/def ~(keyword (str pns) "name") (s/and #(string? %) #(= % ~pname))) 
    (s/def ~(keyword (str pns) "unit") (s/and #(string? %) #(= % ~punit))))) 

(macroexpand-1 
    '(nup ab :foo :bar)) 

s/def只是登記在規範的註冊表中的關鍵字。所以你根本不需要宏。只需使用一個功能,就容易得多。

相關問題