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

附带测试代码的补丁。我已经将其抛出编译器异常,以便显示源代码位置。不清楚这是否符合clojure代码的标准,但希望更多的宏在错误处理中提供这样的功能。

0

评论者:tsdh

此问题已在CLJ-1024中讨论过。我在那里提供了一个补丁,该补丁禁止在defprotocol/definterface等位置使用可变参数和结构化形式。我的补丁在clojure 1.5发布前不久得到应用,但存在错误(禁止过多的使用),因此被撤销,错误得到修复并拒绝。

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

所以,我的补丁再次出现。这次它更加宽松,只禁止在defprotocol/definterface方法声明中和在deftype/defrecord及reify方法实现中使用可变参数。

0

评论者:coventry

最好的祝福,
Alex

0

评论者:tsdh

我的补丁的新版本。

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

0

评论者:tsdh

Alex,如果你不反对,我们能否删除你的补丁,以支持我的补丁,它覆盖了更多的情况?

0

评论者:coventry

最好的祝福,
Alex

0

评论者:tsdh

好的,太好了。:-)

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

0

评论者:coventry

当然可以,Tassilo。已经完成了。

我认为这个case也需要像hugod最初指出的一样进行回归测试。我最初和你犯了同样的错误,但amalloy在我提交补丁之前指出了这一点(link: 1),所以这是一个自然的错误,应该在源代码中记录。

最好的祝福,
Alex

(link: 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? ...))。因此,我已经注释了这些测试并添加了一个大TODO。

0
通过

评论者:tsdh

补丁的新版本,现在所有测试都没有注释并通过。Andy Fingerhut让我意识到,对于4个deftype和reify测试,我需要eval而不是只是宏展开。

0
通过

评论者:jafingerhut

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

0
通过

评论者:tsdh

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

0
通过

评论者:tsdh

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

我的补丁与CLJ-1165之间的一个细微差异在于,这里我用带有文件/行/列信息的CompilerException,而CLJ-1165使用了ex-info。我认为CE更加合适/信息丰富,因为错误已经发生在宏展开期间。

0
by

评论者:michaelblume

已合并到master

0
by

评论者:michaelblume

如果这个合并能够通过就太好了——我只收到了一个用varargs协议发来的pull request,这个协议似乎意外地工作了。因为只有当varargs的结构被调用时,它才被调用,而且总是带有两个额外的参数,这恰好与接口中的'&'和'args'相符。在我弄清楚情况之前,这让我困惑不已。

...