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——太好了!

以下是该问题的演示,包括附件和作为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的docstring表明,方法声明必须指定参数列表和有效的返回类型。我预计所有这些都将无效。

(生成接口:名称 clj1419.IFail,方法 [[fail nil]]) (生成接口:名称 clj1419.IFail,方法 [[fail [] nil]]) (生成接口:名称 clj1419.IFail,方法 [[fail []]])

"nil" 不是一个有效的类型 - 您可以使用 "void" 来表示这一点,并且它效果良好

(生成接口:名称 clj1419.IFail,方法 [[fail [] void]])

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

0

评论由:nathan7发布

但代码似乎暗示了与此相反的情况,因为它有一个 显式的 附加分支,用于处理 pclass 为 nil 的情况。
尽管我喜欢 PL 知识点,但我还没有在 Clojure 的其他地方遇到过 "void",所以我对此感到很惊讶。
维护最小惊讶原则似乎优于关于 nil 是否为类型的迂腐。

0

评论者:alexmiller

寻找可信赖的词汇的两个地方是 docstrings 和 https://clojure.org/documentation 页面。实现细节只是如此。

"nil" 不是一个类型。"void" 是一个记录的类型标识符,表示没有返回值 - https://clojure.org/java_interop#Java Interop-Aliases

0

评论由:nathan7发布

那么,在 asm-type 中进行更好的错误检查如何?

0
) private(settings, i, count) reduction(+:global)Schedule(static:5)={'mismatched insider': {'a': {}}, 'missing': {'iteration_count': excludes: {'*': ['PartialUnified']}}}>已回答

评论者:alexmiller

我已经根据我对这个工单应该是什么的理解更新了标题和描述,这应该是增强对 gen-class 和 gen-interface 的方法规范的错误检查。我不确定这是在 asm-type 中还是其他更早的地方。

0
by

评论者: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](https://clojure.atlassian.net/browse/CLJ-1419)(由 nathan7 报告)
...