Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/neo4j/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Macros Clojure中的常量定义_Macros_Clojure - Fatal编程技术网

Macros Clojure中的常量定义

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

我试图定义一个宏,用于定义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-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”具有更高效的查找。现在,它们更有意义了。