Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/clojure/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
Clojure 为什么莱宁根会被一个顶级的空未来所困扰?_Clojure_Leiningen - Fatal编程技术网

Clojure 为什么莱宁根会被一个顶级的空未来所困扰?

Clojure 为什么莱宁根会被一个顶级的空未来所困扰?,clojure,leiningen,Clojure,Leiningen,下面是一个非常简单的Leiningen项目示例,使用lein new app悬挂,仅使用两个文件project.clj: (定义项目挂起“0.1.0-SNAPSHOT” :依赖项[[org.clojure/clojure“1.6.0”]] :主挂片。核心 :aot[挂起.核心] :目标路径“target/%s” :profiles{:uberjar{:aot:all}) 和src/hanging/core.clj: (ns.core(:gen类)) (println“1”) (未来) (pri

下面是一个非常简单的Leiningen项目示例,使用
lein new app悬挂
,仅使用两个文件
project.clj

(定义项目挂起“0.1.0-SNAPSHOT”
:依赖项[[org.clojure/clojure“1.6.0”]]
:主挂片。核心
:aot[挂起.核心]
:目标路径“target/%s”
:profiles{:uberjar{:aot:all})
src/hanging/core.clj

(ns.core(:gen类))
(println“1”)
(未来)
(println“2”)
(defn-main)
“我还没有做很多……还没有。”
[&args]
(第3页)
运行项目时,这是输出(提示冻结,我必须用C-C终止它):

%lein清理和运行(&L)
编译.core
1.
2.
注释掉
有问题的
Var定义后,这是输出(JVM关闭时):

%lein清理和运行(&L)
编译.core
1.
2.
1.
2.
3.
我猜AOT是罪魁祸首,但有人能解释到底发生了什么吗

我对第二个(注释)版本没有问题:在AOT期间,编译器执行所有顶级表单,这就是为什么1和2在输出中出现两次

但是,为什么添加内部未来为空的var会改变这一点呢?这是否意味着编译器陷入AOT阶段?任何细节和指示都非常感谢



根据建议的答案,我已将
(关机代理)
添加到
(-main)
,但它不会更改编译步骤(编译大约需要60秒)。但是,使用
(关机代理)
程序不再挂起。

这与aot无关,而且与lein无关


如果添加对
(关机代理程序)
的调用,则
-main
函数将返回,程序将不再挂起。Clojure的行为是,如果任何线程池工作人员仍然处于活动状态,则不退出,这取决于您是否让它知道他们已经完成了

添加(关闭代理)对编译步骤没有任何作用,它仍然会挂起一段时间。它确实有助于主应用程序,它现在立即存在。我猜在AOT期间,编译器会在将来运行,然后等待它完成。是的,这是有文档记录的行为。当您进行AOT时,作为编译过程的一部分,名称空间中的所有顶级表单都是
eval
d。如果您以顶级形式创建一个
未来
,它将创建未来,那么您的编译过程将挂起,因为它从不调用
关闭代理