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

欢迎!请查看关于页面了解有关此功能的更多信息。

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

内森,你是否打算提交一份已签署的Clojure贡献者协议,或者你已经有了?如果您还没有,请在此提供详细信息:https://clojure.org/contributing

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

注意:我不能保证您的任何一个补丁会在签署CA后获得Clojure的接受——只能保证如果您没有签署CA,它不会获得接受。

0

评论者:alexmiller

请添加一个例子,说明这种情况是如何发生的,以及当前的错误。

0
_评论者:nathan7_

安德鲁——是的,我已经了解了这一点。我的CA很快就会寄给理查德。(已填写、已签署、已装入信封,只等着那些该死的国际邮票的到来……)

亚历克斯·米勒——塔达!

以下是对问题的演示,包括附件和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”作为返回类型,那么我认为答案是不了。如果工单是请求改进上述失败案例的错误报告,那么我认为我们可以考虑这一点,但它的优先级会非常低。

0

评论者:nathan7

尽管代码似乎暗示了相反的情况,但看到为pclass设置nil的显式额外分支。
尽管我很喜欢PL琐事,但我还没有在其他任何Clojure中遇到过void,因此在这里看到它我感到很惊讶。
维护最小惊奇的原则似乎比关于nil是否是类型的迂腐更可取: (= "nil" (str (type (.methodReturningVoid obj))))

0

评论者:alexmiller

要查找可以依赖的词汇的两个地方是docstrings和https://clojure.org/documentation页面。实现细节就是如此。

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

0

评论者:nathan7

好吧。那么请在asm-type中进行更好的错误检查吗?

0

评论者:alexmiller

我已经根据我对该工单应该是什么的理解更新了标题和描述,该工单是增强gen-class和gen-interface的方法规范的错误检查。我不确定这是在asm-type中还是在更早的地方。

0

评论者: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 []]])
在宏展开 gen-interface 时出现意外错误(ClassFormatError)(在REPL:1:1)。
类名在类文件 clj1419/IFail 的描述符中包含非法字符

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

0
参考: https://clojure.atlassian.net/browse/CLJ-1419 (由 nathan7 报告)
...