宏 – Clojure defmacro丢失元数据

我试图创建一个小的Clojure宏,它使用一个类型提示来确定一个String:

(defmacro def-string [name value]
  `(def ^String ~name ~value))

(def-string db-host-option "db-host")

当我宏展开它时,类型提示丢失:

(macroexpand '(def-string db-host-option "db-host"))
;=> (def db-host-option "db-host")

不介意暗示这种的智慧。

为什么宏会丢失元数据?如何编写此宏或包含元数据的任何内容?

最佳答案
^是一个阅读器宏。 defmacro从来没有看到它。提示放在列表上(unquote name)。比较(meta ^ String’x)与(meta’^ String x)来查看效果。

你需要把提示放在符号上。

(defmacro def-string
  [name value]
  `(def ~(vary-meta name assoc :tag `String) ~value))

和用法:

user=> (def-string foo "bar")
#'user/foo
user=> (meta #'foo)
{:ns #<Namespace user>, :name foo, :file "NO_SOURCE_PATH", :line 5, :tag java.lang.String}

转载注明原文:宏 – Clojure defmacro丢失元数据 - 代码日志