2024年Clojure调查问卷中分享您的想法!

欢迎!请在关于页面查看更多关于此功能的信息。

0
错误

我尝试在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中讨论过了。我在那里提供了一个补丁,禁止在各个地方使用可变参数和析构形式,包括defprotocol/definterface。我的补丁在Clojure 1.5发布前不久就被应用了,但它有一个bug(禁止过多使用),因此被回滚,并关闭了bug并拒绝。

我在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

如果我们可以将其合并就好了——我刚刚收到一个使用可变参数协议的pull request,它的确意外地起作用了,因为只有当可变参数的arity被调用时,它才被用两个额外的参数调用,这与界面中的'&'和'args'匹配。在我弄清楚发生了什么之前,这让我非常困惑。

...