2024 年 Clojure 状态调查! 中分享您的想法。

欢迎!请查阅 关于 页面,了解更多关于它的工作方式的信息。

0
错误

我试图在 defprotocol 的方法签名中使用 &。显然(见下文),这是编译成将 & 变为简单的参数名,并且没有对可变数量参数的特殊处理。我认为在协议签名中使用 & 应该被检测到并立即抛出异常(我还认为应该对签名上的这种限制进行文档化;虽然它暗示(在我后来意识到后)是 defprotocol 创建了一个 Java 接口的事实,但在当前的文档中我没有找到具体的说明)。

user=> (defprotocol Applier (app (link: this f & args)))
Applier
user=> (deftype A (link: ) Applier (app (link: _ f & args) (prn f & args) (apply f args)))
user.A
user=> (app (A.) + 1 2)

<core$PLUS clojure.core$PLUS@5d9d0d20> 1 2

IllegalArgumentException 不知如何创建来自:java.lang.Long 的 ISeq
clojure.lang.RT.seqFrom (RT.java:487)

16 答案

0

评论由:coventry 发布

附有测试代码的补丁。我已经让它抛出 CompilerException,这样就可以显示源代码位置。我不确定这是否符合 clojure 代码的标准,但希望更多的宏提供这种错误处理。

0

评论由:tsdh 发布

这个问题已经在CLJ-1024中被讨论过了。我在那里提供了一个补丁,禁止在多个地方使用varargs和解构形式,包括defprotocol/definterface。我的补丁在clojure 1.5发布前不久被应用,但存在一个错误(禁止过多的使用),因此被回滚,错误也被关闭并拒绝。

我被要求在1.5发布后再次提出这个问题。

所以这里是我的补丁再次。这次它要宽松得多,仅在defprotocol/definterface方法声明中禁止varargs,以及在deftype/defrecord和reify方法实现中。

0

评论由:coventry 发布

谢谢,Tassilo。如果JIRA系统中哪里我可以查阅类似问题的以前的工作,我将不胜感激。

最好的问候,
Alex

0

评论由:tsdh 发布

我补丁的新版本。

我现在使用一个包含正确文件/行/列信息的CompilerException,就像Alex所做的那样。我还添加了他的测试用例(它通过了)。

关于你的问题,Alex:搜索“varargs”会将CLJ-1024列出来,但你可能还是会继续查看,因为这个是一个关闭的问题...

0

评论由:tsdh 发布

Alex,如果你没有异议,我们可以移除你的补丁,以便采用我的,它涵盖了更多的情况?

0

评论由:coventry 发布

是的。刚刚读了1024及其相关的邮件列表讨论。你完全应该得到这个功劳:你的补丁更全面,你已经在这方面工作很长时间了。:-) 感谢你整合了我的补丁中的优点。

最好的问候,
Alex

0

评论由:tsdh 发布

好的,太好了。:-)

看起来我没有权限删除他人的附件,所以请你自己删除你的补丁?

0

评论由:coventry 发布

当然,Tassilo。已经完成了。

我认为这还需要对hugod最初指出的情况进行回归测试。我最初和你犯了同样的错误,但在提交补丁之前,amalloy指出了这一点(链接: 1),所以这是一个自然的错误,可能需要在源代码中记录。

最好的问候,
Alex

(链接: 1) http://logs.lazybot.org/irc.freenode.net/#clojure/2013-10-21.txt 搜索14:48:34。

0

评论由:tsdh 发布

Alex,我已添加了你建议的回归测试。感谢指出这一点。

此外,我还添加了检查definterface方法声明的测试,以及使用defrecord、deftype和reify制作的内联方法实现的测试。

然而,对于deftype和reify的测试我无法解决问题。当我在一个REPL中评估测试中使用的宏展开形式时,我可以看到编译异常被成功抛出并打印出来。但似乎它在某个地方被捕获了,因此宏展开会返回一个形式,异常没有到达(is (thrown? ...))。因此,我已经注释了这些测试并添加了一个大的FIXME。

0

评论由:tsdh 发布

将补丁重新基合并到当前主分支,现在已经注释了所有测试并通过。

0

评论者:jafingerhut

我尚未调查原因,但在2013年10月25日的Clojure master的最新提交之后,补丁0001-Forbid-vararg-declaration-in-defprotocol-definterfac.patch不再干净地应用。

0

评论由:tsdh 发布

我已经将补丁重构到当前主分支,以便它可以再次干净地应用。

0

评论由:tsdh 发布

Stu,我已经将这个问题分配给你,因为你已被分配到CLJ-1165,我将该问题关闭为与此问题重复。

我在处理此问题的补丁与CLJ-1165之间的一个细微差别是,在这里我使用了带有文件/行/列信息的CompilerException,而在CLJ-1165中,我使用了ex-info。我认为CE更合适/更具信息量,因为错误已经在宏扩展期间被触发。

0

评论者:michaelblume

基于master重新安置

0

评论者:michaelblume

如果我们能够合并这个分支就好了——我刚刚收到了一个使用可变参数协议的拉取请求,这个逻辑似乎是因为最后一次调用可变参数arity时,它使用了两个额外的参数,匹配接口中的“&”和“args”。在我弄清楚是怎么回事之前,把这件事情弄的很混乱。

...