gpt4 book ai didi

clojure - 何时以及可以使用 leiningen 评估 clojure 文件多少次?

转载 作者:行者123 更新时间:2023-12-02 16:32:21 25 4
gpt4 key购买 nike

我在向编写宏的代码添加警告时发现,文件正文在编译期间被执行了两次。是否有一个原因?这是莱宁根特有的吗?我无法用(compile ...)重现这个.

简化版本:

(ns foo.core
(:require foo.bar))

;; empty
<小时/>
(ns foo.bar)

(println "hello")

$ lein compile :all

Compiling foo.core

hello

Compiling foo.bar

hello

进一步测试表明,命名空间在编译期间会在自身之上重新加载:

(ns foo.bar)

(declare wasd)
(println wasd)
(def wasd 2)

$ lein clean

$ lein compile :all

Compiling foo.core

#<Unbound Unbound: #'foo.bar/wasd>

Compiling foo.bar

2

在更复杂的情况下,我在编译期间发生这种情况,然后每次从 lein 运行或启动 repl 时都会发生一次。我不知道为什么。这都是 clojure 1.6 和 leiningen 2.5.0 的全部。

最佳答案

Leiningen 对项目的结构以及命名空间如何相互关联一无所知。因此,在编译项目时,lein 只需启动 JVM 并强制一次加载每个 namespace 。这意味着,正如您所注意到的, namespace 将被重新加载,从而导致您注意到的双重评估行为。

相比之下,(clojure.core/compile)只需使用 clojure.core/*compile-files* 加载目标资源即可边界。这将导致目标资源及其所需的所有资源被加载并编译为类文件。但是,它不会像 Leiningen 的编译操作那样遍历整个项目结构来编译所有资源。

关于clojure - 何时以及可以使用 leiningen 评估 clojure 文件多少次?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27054049/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com