2024 Clojure现状调查!中分享你的想法。

欢迎!请查看关于页面以获取更多关于该系统如何运作的信息。

0
错误

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

user=> (defprotocol Applier (app (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中讨论过了。在那里,我提供了一个补丁,禁止在多个地方使用可变参数和构造型,包括defprotocol/definterface。我的补丁在clojure 1.5发布前不久被应用,但它有一个错误(禁止过多使用),因此它被回滚,并关闭了错误报告。

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

所以这里是我的补丁再次出现。这一次它要宽松得多,只禁止在defprotocol/definterface方法声明中、在deftype/defrecord和reify方法实现中声明可变参数。

0

评论由:coventry 提出

谢谢,Tassilo。如果JIRA系统中哪里可以检查类似问题的先前工作,我将非常感激得到一个提示。

最好的问候,
Alex

0

评论由:tsdh 提出

我补丁的新版本。

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

关于您的问题,Alex:搜索“可变参数”将会列出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 提出

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

0

评论者:jafingerhut

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

0

评论由:tsdh 提出

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

0

评论由:tsdh 提出

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

我修改这个问题和 CLJ-1165 之间的一个微小差别在于,这里我使用具有文件/行/列信息的 CompilerException,而在 CLJ-1165 中我使用了 ex-info。我认为 CE 更合适/更有信息量,因为错误已经在宏展开期间触发。

0

评论者:michaelblume

基于 master 分支进行更新的评论

0

评论者:michaelblume

如果我们能合并这项工作就太好了--我刚收到一个使用 varargs 协议的请求,这个协议似乎是偶然成功地实现的,因为只有当 varargs 的参数数量被调用时,它才叫了两个额外的参数,与界面中的 '& 和 'args 匹配。在我弄清楚发生了什么之前,这让我非常困惑。

...