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

欢迎!请参考关于页面以获取有关如何操作的更多信息。

0 投票
Clojure

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

`
(defprotocol Foo
(hello [this] "说你好"))

(def bar
(reify Foo

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

(when-not (satisfies? Foo bar)
(throw (Exception. "bar 不满足 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

使用项目 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(Clojure源文件)来复现这个问题吗?

0 投票

评论者:alexmiller

我怀疑你可能可以通过按照某种顺序编译来复现这个问题,但我还没有尝试这样做。但可能的答案可能是:按正确的顺序编译。

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