2024年 Clojure 状态调查! 中分享您的想法。

欢迎!请参阅 关于 页面以了解该工作原理的更多信息。

0
Clojure

https://github.com/MichaelBlume/reify-fail

`
(defprotocol Foo
(hello [this] "Says hello"))

(def bar
(reify Foo

(hello [this] "hello, world")))

(when-not (satisfies? Foo bar)
(throw (Exception. "bar doesn't satisfy Foo")))
`

笔记

项目是 AOT
另一个命名空间需要此命名空间。该命名空间优先编译。如果没有该命名空间,问题就会消失。

12 答案

0

由 hiredman 发表的评论:

检查完仓库后,您采取了哪些步骤来重现此问题?

我克隆了仓库并运行 lein compile,但没有出现任何错误。

0

由 michaelblume 发表的评论:

我用 lein check 来重现这个问题,但是 lein compile 也会失败,所以我感到困惑。

0

由 michaelblume 发表的评论:

我认为重要的是,几乎为空的命名空间先编译,可能存在编译顺序的平台差异?

0

由 michaelblume 发表的评论:

在Mac OS和Ubuntu系统下,测试库对我的失败,两者都使用Java 8

0

由 michaelblume 发表的评论:

在Ubuntu下,我有

$ lein -v
Leiningen 2.7.1,Java 1.8.0_151 OpenJDK 64位服务器VM

0
评论者:jafingerhut

在这些操作系统上:Ubuntu 16.04.3 Linux,macOS 10.12.6

使用以下Leiningen版本:2.7.1,2.8.1

我相信所有实验都使用的是最新的JDK 1.8版本

使用以下Clojure版本:1.7.0,1.8.0,1.9.0

我对项目https://github.com/MichaelBlume/reify-fail, 使用 'lein check' 和 'lein compile' 命令时会出现错误,但前提是先执行 '/bin/rm -fr target' 命令(或者在目标目录创建之前运行,例如在运行 'git clone' 命令后立即运行)。

如果运行两次命令,第一次命令会在目标目录中创建许多.class文件,而第二个命令则不会出现错误。
0

由 hiredman 发表的评论:

如果我用 :aot :all 替换为 :aot (link: com.lendup.citadel.pipeline com.lendup.citadel.providers.mocky),就可以重现该错误。我怀疑Leiningen可以通过在编译命名空间之间进行过时的ns检查来修复此问题,以避免重复编译传递命名空间。

0

由 hiredman 发表的评论:

可能与 https://github.com/technomancy/leiningen/issues/2316 有关

0
0

评论者:bronsa

这是关于clojure还是Lein的问题?我们能否通过纯clj重现此问题?

0

评论者:alexmiller

我认为您可以通过编译器的某种顺序重现它,但我还没有尝试。但结果可能为:按照正确的顺序编译项目。

0
参考:https://clojure.atlassian.net/browse/CLJ-2303(由michaelblume报告)
...