我试图在 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)