请在 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接受——只能保证不签署CA的话是不会被接受的。

0

评论者:alexmiller

请添加一个发生这种情况的示例以及当前错误。

0
_评论者:nathan7_

Andy — 对,我已读过相关内容。我的CA即将发送给Rich。(已填写、已签名、装入信封,只需等待那些该死的国际邮票的到来…)

Alex Miller — 哇!

问题的演示:附件以及作为这里
0

评论者:nathan7

以下是编译器崩溃的日志(也已添加到附件中)

0

评论者:nathan7

哎呀,由于我个人理解上的错误,两个补丁都相当有问题。
我完全忘记了asm-type参数是一个symbol,而不仅仅是字符串。
修改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 trivia,但我还没有在其他任何地方遇到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报告)
...