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文档字符串的理解是,方法声明必须指定一个参数列表和一个有效的返回类型。我预计这些都会无效。

(生成接口::name clj1419.IFail ::methods [[fail nil]]) (生成接口::name clj1419.IFail ::methods [[fail [] nil]]) (生成接口::name clj1419.IFail ::methods [[fail []]])

"nil" 不是一个有效类型 - 您可以使用 "void" 来实现这个目的,并且这样工作正常

(生成接口::name clj1419.IFail ::methods [[fail [] void]])

如果这个工单(正如标题所述)是请求允许省略返回类型或使用 "nil" 作为返回类型,那么我认为答案是 no。如果工单是请求改进上述失败案例的错误报告,那么我认为我们可以考虑这一点,但它的优先级会非常低。

0 投票

评论者:nathan7

但是代码似乎暗示了相反的情况,因为有关于 pclasses 为 nil 的 显式 附加分支。
尽管我喜欢 PL 知识点,但我还没有在 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 的方法规范的错误检查。我不确定这出现在 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 投票
by
参考:https://clojure.atlassian.net/browse/CLJ-1419 (由 nathan7 报告)
...