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中——只是如果在没有签署的情况下,它不会被接受。

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

代码似乎暗示了相反的情况,看到了

为nil时显式的额外分支。
尽管我喜欢PL trivia,但我还没有在任何其他Clojure地方遇到过void,因此在这里看到它让我感到惊讶。
维护最小惊讶的原则似乎是比关于"nil"是否是类型的问题更为可取:(= "nil" (str (type (.methodReturningVoid obj))))

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 spec的错误检查。我不确定这是在asm-type还是更早的地方。

0

评论者:alexmiller

到1.10版本,这些现在都会抛出错误

`
user=> (gen-interface :name clj1419.IFail :methods [[myMethod java.lang.String]])
语法错误,宏展开 gen-interface 在 (REPL:1:1) 处。
不知道如何从: 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
by
...