2017-04-06 52 views
1

讓我們假設我已經DEFTYPE尋找下一個方法:DEFTYPE在defmacro與元數據

(deftype ^{A: a} Name []) 

我想定義的宏發電DEFTYPE:

(defmacro dotype [name] 
    `(deftype ^{A :a} ~name [])) 

有關的元數據。然而,我失去的信息。

(macroexpand-1 '(dotype T)) 
;> (clojure.core/deftype T []) 

我試圖用技巧與vary-meta避免使用^ {}宏。不幸的是,deftype不支持IObj接口(不支持元數據),並且我所有的嘗試都不起作用。

請建議實現此宏的方式。謝謝!

回答

2

這個工作對我來說:

(deftype A []) 

(defmacro dotype [name] 
    `(deftype ~(with-meta name {:tag A}) [])) 

(binding [*print-meta* true] 
    (prn (macroexpand-1 '(dotype T)))) 

; user=> (clojure.core/deftype ^user.A T []) 

注:元數據默認情況下不打印,所以你必須使通過如上圖所示,或者與(set! *print-meta* true)設置在REPL結合*print-meta*,但在REPL中永久設置將在屏幕上打印大量無趣的信息,因此最好避免(!)。

+0

是的,* print-meta *是答案。謝謝! – Rustem