Macros Clojure中的常量定义
我试图定义一个宏,用于定义Clojure 1.3中添加的编译时常量语法: ==2.14^:常数定义== ^:const允许您使用更快的引用命名基元值 (def常数{:pi3.14:e2.71}) (定义:常数pi(:pi常量))(定义:常数e(:e常量)) 在映射中查找:e和:pi的开销发生在编译时 时间,作为(:pi常数)和(:e常数)在其 对父def表单进行评估 基本上,我想在Macros Clojure中的常量定义,macros,clojure,Macros,Clojure,我试图定义一个宏,用于定义Clojure 1.3中添加的编译时常量语法: ==2.14^:常数定义== ^:const允许您使用更快的引用命名基元值 (def常数{:pi3.14:e2.71}) (定义:常数pi(:pi常量))(定义:常数e(:e常量)) 在映射中查找:e和:pi的开销发生在编译时 时间,作为(:pi常数)和(:e常数)在其 对父def表单进行评估 基本上,我想在(def^:const…)周围添加一些语法糖,所以我尝试这样做: (defmacro defconst [const
(def^:const…)
周围添加一些语法糖,所以我尝试这样做:
(defmacro defconst [const-name const-val]
`(def ^:const ~const-name ~const-val))
但这不起作用:
user=> (macroexpand '(defconst pi 3.14))
(def pi 3.14)
从我收集的资料来看,#^
元快捷方式是一个读卡器宏,要定义一个向某些内容添加元数据的宏,应该使用(带元…
)
我没有找到任何关于^:const
的文档。这种语法结构甚至会创建某种元数据吗?以下示例未显示任何内容:
user=> (def ^:const pi 3.14)
#'user/pi
user=> (meta pi)
nil
第一个问题是您正在检查
3.14
的元数据。使用(meta(var-pi))
查看pi
的元数据。如果这样做,您将看到它包括:const true
(defmacro defconst [const-name const-val]
`(def
~(with-meta const-name
(assoc (meta const-name) :const true))
~const-val))
准确复制
^:const
(代码改编自defn-
)的元数据和性能。感谢您的回答。我通过执行(time(dotimes[\u1E10](*pi)))
vs(time(dotimes[\u1E10](*3.14 3.14))
进行检查,它相当于相同的执行时间。我没有抓住const
——我没有抓住const
“vars”具有更高效的查找。现在,它们更有意义了。