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

欢迎!请查看关于页面了解如何使用本网站。

0
错误

以下内容无效,在gen-class或gen-interface上调用时应产生错误

(gen-interface :name clj1419.IFail :methods [[myMethod java.lang.String]]) ;; 无参数,抛出错误 (gen-interface :name clj1419.IFail :methods [[myMethod []]]) ;; 无返回类型 (gen-interface :name clj1419.IFail :methods [[myMethod]]) ;; 无参数或返回类型

第一个示例会抛出错误。第二个和第三个示例不会,但会生成无效的类,请使用以下命令进行验证

(.getMethods clj1419.IFail) ClassNotFoundException java.lang. java.net.URLClassLoader$1.run (URLClassLoader.java:366)

添加检查以防止这些错误。

14 个答案

0

评论由:nathan7创建

我已经实现了这两个修复,并将它们作为补丁附加。

0

评论由:nathan7创建

我认为这里的问题出在asm-type的行为上(当传入nil参数时,它可以输出无效的类型名称),因此我更喜欢第一个修复而不是仅仅是治疗症状的generate-interface修复。

0

评论人:jafingerhut

Nathan,你打算提交一份正式的Clojure贡献者协议,还是已经提交了?如果您还没有,请在此处查看详情:https://clojure.org/contributing

非贡献者的补丁不能提交到Clojure。

注意:我不能保证您签署CA后您的补丁会被接受到Clojure中,只能保证如果不签署则会。

0

评论人:alexmiller

请添加一个演示该问题的例子以及当前的错误。

0
评论人:nathan7

Andy — 嗯,我已经阅读了这方面的内容。我的CA已经开始提交给Rich了。(填写完毕、已签名、已装封,只需等待那些该死的国际邮票的到来……)

Alex Miller — Tahdah!

以下是问题的演示,包括附加的文件和Gist: https://gist.github.com/nathan7/3a7e3a09e458f1354cbb
0

评论由:nathan7创建

这是编译器崩溃的日志(也已添加到Gist中)

0

评论由:nathan7创建

哎呀,我的两个补丁都因为我对自己的误解而出问题了。
我完全忘记了asm-type需要一个符号,而不是一个字符串。
修改asm-type绝对是个糟糕的主意,那个检查只是看看是否应该延迟到prim->class。
将nil添加到prim->class是可以的(我也附上了我的补丁),但与修复gen-interface相比,这看起来有些不那么优雅。
(顺便说一句:我在探索Clojure代码库中享受了很多乐趣!感谢大家的付出!)

0

评论人:alexmiller

我对gen-interface文档字符串的理解是,方法声明必须指定参数列表和有效的返回类型。预计所有这些都将无效

(gen-interface :name clj1419.IFail :methods [[fail nil]]) (gen-interface :name clj1419.IFail :methods [[fail [] nil]]) (gen-interface :name clj1419.IFail :methods [[fail []]])

"nil" 不是一个有效的类型 - 你可以使用 "void" 来实现这一点,并且它工作得很正常

(gen-interface :name clj1419.IFail :methods [[fail [] void]])

如果这个问题(如标题所述)是请求允许省略返回类型或使用 "nil" 作为返回类型,那么我认为答案是 no。如果问题是请求改进上述失败情况下的错误报告,我认为我们可以考虑这一点,但它将非常低优先级。

0

评论由:nathan7创建

代码似乎暗示了与此相反的情况,考虑到为pclasses显式提供的额外分支为nil。
尽管我喜欢PL trivia,但我还没有在其他任何Clojure的代码中遇到 "void",在这里看到它让人惊讶。
遵守最小惊讶.principle的原则似乎比坚持nil是否是一种类型更为可取

0

评论人:alexmiller

要查找信赖的词语,有两个地方:文档字符串和https://clojure.org/documentation页面。实现细节只是这样。

"nil" 不是一个类型。"void" 是一个记录的类型标识符,表示没有返回值 - https://clojure.org/java_interop#Java Interop-Aliases

0

评论由:nathan7创建

那么,在asm-type中进行更好的错误检查如何?

0

评论人:alexmiller

根据我对该票据应包含内容的理解,我已更新了标题和描述,即增强gen-class和gen-interface的method specs的错误检查。我不确定这是在asm-type或更早的阶段。

0
by

评论人:alexmiller

截至1.10版本,现在所有这些都会引发错误

`
user=> (gen-interface :name clj1419.IFail :methods [[myMethod java.lang.String]])
语法错误:在(REPL:1:1)处宏展开gen-interface。
不知道如何从:clojure.lang.Symbol创建ISeq。

user=> (gen-interface :name clj1419.IFail :methods [[myMethod []]])
在(REPL:1:1)处展开gen-interface时出现意外错误(类格式错误)。
类名中在类文件 clj1419/IFail 的描述符中包含非法字符。

user=> (gen-interface :name clj1419.IFail :methods [[myMethod]])
在(REPL:1:1)处展开gen-interface时出现意外错误(类格式错误)。
类名中在类文件 clj1419/IFail 的描述符中包含非法字符。
`

0
by
...