macros - Clojure defmacro 丢失元数据

标签 macros clojure type-hinting

我正在尝试创建一个小的 Clojure 宏 def s 带有类型提示的字符串:

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

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

当我macroexpand它,类型提示丢失:
(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}

关于macros - Clojure defmacro 丢失元数据,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7754429/

相关文章:

从头文件调用函数

macros - 我找不到 `mock!` 的定义

clojure - 将函数列表应用于 Clojure 中相应的数据列表

python - 如何使用函数参数作为类型提示?

c - 这些奇怪的宏定义是什么意思(它们是否正确?)

java - 存储 Clojure(或 JVM)应用程序使用的文件的常规位置

clojure - 如何在 Clojure 中替换向量中的最后一个元素

自定义模块级常量的 Python 类型提示

支持 __getitem__ 的类的 Python 类型提示

parsing - 在 proc 宏派生上将属性转换为标识符