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

IllegalStateException 无法从:java.lang.Long创建ISeq
clojure.lang.RT.seqFrom (RT.java:487)

16 答案

0

评论者:coventry

附带测试代码的补丁。我已经让它在编译时抛出CompilerException,以便显示源代码位置。不确定这在Clojure代码中是否合适,但我希望更多的宏在错误处理中提供这种功能。

0

评论者:tsdh

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

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

所以,这是我的补丁再次出现。这次它变得宽松得多,只禁止在defprotocol/definterface方法声明和在deftype/defrecord和reify方法实现中使用varargs。

0

评论者:coventry

谢谢,Tassilo。如果在JIRA系统中可以检查类似的先前工作,我将非常感激一个指针。

最好的问候,
Alex

0

评论者:tsdh

我的补丁的版本更新。

现在,我使用类似于Alex的带有正确文件/行/列信息的CompilerException。我还添加了他的测试用例(通过)。

关于您的问题,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中评估用于测试的macroexpand形式时,我可以看到编译器异常成功抛出并打印出来。但它似乎在中间被捕获了,所以macroexpand返回了一个形式,异常没有到达(is (thrown? ...))。因此,我已经注释掉这些测试并添加了一个巨大的FIXME。

0

评论者:tsdh

补丁的新版本现在已经所有测试都已取消注释并且通过。Andy Fingerhut让我知道,对于4个deftype和reify测试,我需要一个eval,而不仅仅是macroexpand。

0

_comments by: jafingerhut

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

0

评论者:tsdh

我已经将补丁重置到当前的master上,以便它可以再次干净地应用。

0

评论者:tsdh

Stu,我已将此问题分配给你,因为你已被分配负责CLJ-1165问题,我已将其关闭为与此问题重复。

我与CLJ-1165的补丁有个小差异,在这里我使用了带文件/行/列信息的CompilerException,而在CLJ-1165中我使用了ex-info。我认为CE更合适/更具信息性,因为错误已在宏扩展期间触发。

0

评论人:michaelblume

重新合并到master上

0

评论人:michaelblume

如果能够合并这个就好了——我刚刚收到了一个使用varargs协议的pull request,这个协议似乎因为只在调用varargs arity时额外传了两个参数,这两个参数与接口中的"&"和"args"相匹配,就这样偶然地工作了。在我发现实际情况之前,这让我非常困惑。

...