【发布时间】:2012-02-07 14:08:57
【问题描述】:
我正在尝试定义一个宏来定义 Clojure 1.3 中添加的编译时常量语法:
== 2.14 ^:const defs ==
^:const 让您可以更快地引用原始值。
(定义常量 {:pi 3.14 :e 2.71})
(def ^:const pi (:pi 常量)) (def ^:const e (:e 常量))
在映射中查找 :e 和 :pi 的开销发生在编译时 时间,因为 (:pi 常数) 和 (:e 常数) 在它们的 评估父 def 表单。
基本上我想要(def ^:const ... ...) 周围的一些语法糖,所以我尝试这样做:
(defmacro defconst [const-name const-val]
`(def ^:const ~const-name ~const-val))
但这不起作用:
user=> (macroexpand '(defconst pi 3.14))
(def pi 3.14)
据我所知,#^<...> 元快捷方式是一个阅读器宏,要定义一个向某物添加一些元数据的宏,应该使用(with-meta ...)。
我没有找到任何关于 ^:const 的文档。这种句法结构甚至会创建某种元数据吗?以下示例未显示任何内容:
user=> (def ^:const pi 3.14)
#'user/pi
user=> (meta pi)
nil
【问题讨论】: