我尝试在 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 无法创建 ISeq 从:java.lang.Long
clojure.lang.RT.seqFrom (RT.java:487)