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 (link: com.lendup.citadel.pipeline com.lendup.citadel.providers.mocky)替换:aot :all,我可以在那里重现错误。我怀疑lein可以在编译命名空间之间进行旧命名空间检查,以避免重复编译传递命名空间,从而解决这个问题。

0

评论者:hiredman

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

0

评论者:ikitommi

相关:[https://github.com/technomancy/leiningen/issues/2508](https://github.com/technomancy/leiningen/issues/2508)

0

评论者:bronsa

这是Clojure还是Lein的问题?我们能否通过裸clj代码重现这个问题?

0

评论者:alexmiller

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

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