我尝试在 defprotocol 的方法签名中使用 &。显然(见下文),这会被编译成简单的参数名,并且没有对可变参数数量进行特殊处理。我认为在协议签名中使用 & 应该能够检测到并立即抛出异常(我也认为对这个签名的限制应该被文档化;尽管我在后来意识到这一点后,在当前文档中并没有找到这个规定的具体说明(不过当然,这是由 defprotocol 创建一个 Java 接口所暗示的))。
(defprotocol Applier (app (link: this f & args)))
Applier
(deftype A (link: ) Applier (app (link: _ f & args) (prn f & args) (apply f args)))
user.A
(app (A.) + 1 2)
<core$PLUS clojure.core$PLUS@5d9d0d20> 1 2
IllegalArgumentException 无法从 java.lang.Long 创建 ISeq
clojure.lang.RT.seqFrom (RT.java:487)