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

Nathan,您计划提交签名Clojure贡献者协议,还是有?如果您还没有,请在此处查看详细信息:https://clojure.org/contributing

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

注意:即使您签署了CA,我也无法保证您的补丁之一能被Clojure接收——只能保证如果没有签署,是不会被接收的。

0

评论者:alexmiller

请添加此问题发生的示例和当前错误。

0
_评论者:nathan7_

Andy - 是的,我已经阅读关于这一点的内容。我的CA将很快提交给Rich。(填写完毕,已签署,放入信封中,只需等待那些该死的国际邮票的到来……)

Alex Miller - 嘿嘿!

此问题的演示,包括附件和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

然而,代码似乎暗示了相反的情况,因为为pclasses添加的显式额外分支使其为nil。
尽管我很喜欢PL trivia,但我还没有在其他任何地方遇到过Clojure中的void,对此我很惊讶。
维护最小惊讶原则似乎比是否meld是“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报告)
...