gpt4 book ai didi

macros - Clojure defmacro 丢失元数据

转载 作者:行者123 更新时间:2023-12-03 10:54:59 24 4
gpt4 key购买 nike

我正在尝试创建一个小的 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/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com