请分享您的想法参与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。
向prim->class添加nil会有效(我也附带了我的补丁),但这样做开始看起来与只修补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 知识,但我尚未在 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报告)
...