Clojure的协议功能可以像普通函数一样可变吗?

Rob*_*lan 11 protocols clojure

使用clojure函数,我可以定义:

(defn f [x & xs] (apply some-function x xs))
Run Code Online (Sandbox Code Playgroud)

我试图用协议做同样的事情,例如

(defprotocol foo
  (bar [f])
  (baz [f & gs]))
Run Code Online (Sandbox Code Playgroud)

这编译(至少在REPL中),但任何实现类型似乎都失败了(变量,baz)方法.官方不支持这个吗?我咨询过的消息来源是沉默的.

ama*_*loy 11

由于Stuart Sierra给出的原因,这不受支持.为了更详细一些,该&符号仅在解构上下文let或函数参数中是特殊的.正如斯图尔特所说,defprotocol不是这样的背景.

&仍然是一个合法的象征,所以你定义的协议有两个功能:bar它有一个参数命名f,并baz有三个,命名f,&gs.


Ale*_*Ott 9

正如Stuart Sierra在后续主题中所解释的那样,不支持可变方法,并且将来可能不会支持