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 on Java 1.8.0_151 OpenJDK 64-Bit Server 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

使用命令 'lein check' 和 'lein compile' 在项目 https://github.com/MichaelBlume/reify-fail, 都会出现错误,但只有在我先运行 '/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

评论者:ikitommi

相关: https://github.com/technomancy/leiningen/issues/2508

0

评论者:bronsa

这是Clojure或Lein的问题吗?我们可以通过纯clj来重现这个问题吗?

0

评论者:alexmiller

我怀疑您可以通过按特定顺序编译来重现它,但我还没有尝试这样做。但结果答案可能是:按正确顺序编译。

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