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

欢迎!请参阅关于页面了解有关如何使用此工具的更多信息。

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即将寄给Rich。(已填写、已签署、放入信封中,只盼那些可恶的国际邮票的到来……)

亚历克斯·米勒——哇!

以下是一个问题说明,包括附件和作为一个格IST: https://gist.github.com/nathan7/3a7e3a09e458f1354cbb
0 投票

由:nathan7发表的评论

以下是编译器崩溃的日志,也添加到了gist中

0 投票

由:nathan7发表的评论

哎呀,我的两个补丁由于我个人的误解而出了一些问题。
我完全忘记了asm-type reception拿的是一个符号,而不是一个字符串。
修改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发表的评论

代码似乎暗示了相反的情况,因为存在为 pclasses 使 nil 的显式附加分支。
尽管我喜欢 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 []]])
在(REPL:1:1)处宏展开gen-interface时出现意外错误(ClassFormatError)。
类文件clj1419/IFail中的描述符包含非法字符。

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

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