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发表的评论

在macOS和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

我相信所有的实验都使用了Java Development Kit (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),我就能在那里重现这个错误。我怀疑lein可以在编译命名空间之间执行旧的名称空间检查,以避免重复编译传递的命名空间来修复这个问题。

0

由:hiredman发表的评论

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

0
0
by

评论由:bronsa

这是Clojure还是Lein问题?我们可以使用裸clj重现这个问题吗?

0
by

评论由:alexmiller

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

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