这个问题纯粹来自“精神主宰”,大概没有实用价值。
如果我在 Clojure 中使用 定义一个值def
,是否可以诱导编译器在编译时评估它,而不是等到运行时?
(def the-answer 42)
(+ the-answer 1)
我想我可以定义一个宏,但是调用语法变得有点尴尬:
(defmacro the-answer [] 42)
(+ (the-answer) 1)
这也有效,但仍然很难看:
(+ `~the-answer 1)
我也理解(或相信)Clojure 在编译时计算常量表达式:
(def milliseconds-per-day (* 24 60 60 1000))
我只是在学习 Common Lisp,但我的理解是 Common Lisp 支持用户定义的阅读器宏,因此您可以定义一个阅读器宏(类似于#$
),在编译时评估以下符号:
(+ #$the-answer 1)
顺便说一句,这种语法并不比宏调用“漂亮”。
如何让 Clojure 在编译时评估常量变量并将引用替换为实际值?它已经这样做了吗?
在有人开始引用 Knuth 定律(“过早优化是万恶之源”)之前,我问这个问题是为了更好地理解 Clojure 编译的内部结构。