clojure编译器会在编译时自动计算文字表达式吗?

Rob*_*lan 7 compiler-construction clojure

这可能是一个愚蠢的问题,但是:

假设一个表达式仅依赖于文字,或者仅依赖于文字的其他表达式; 编译器会在编译时对此进行评估吗?

假设我有,

(def a (some-time-consuming-function some-literal))

(def b (some-other-time-consuming-function a))
Run Code Online (Sandbox Code Playgroud)

是否会在编译时完全评估b和a,以便用户不受影响?

编辑:非常感谢,所有的答案都非常有帮助.

编辑6.6.2011: 事实证明,如果您尝试使用此技术预先计算非常大的数据结构,则很容易使类文件太大而无法加载.在这些情况下,您希望创建一个将被读入的文件而不是将要加载的类文件.这些答案中描述的宏观技巧只应在返回值不是过大的结构的情况下应用.

抛出的错误是:"java.lang.ClassFormatError:此类索引无效"有关相关情况的讨论,请参阅此主题.

Ale*_*art 6

根本不傻,我不得不考虑并测试它.

它只有在使用宏而不是函数时才有效,因为宏的主体是在compile/macroexpansion-time时计算的.例如:

(defmacro preprocess [f & args]
  (let [x# (apply (resolve f) args)]
    `~x#))

(def a (preprocess some-time-consuming-function some-literal))

(def b (preprocess some-other-time-consuming-function a))

然后a,b我们def将评估返回的值preprocess.