当前位置 : 主页 > 大数据 > 区块链 >

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

来源:互联网 收集:自由互联 发布时间:2021-06-22
使用clojure功能,我可以定义: (defn f [x xs] (apply some-function x xs)) 我试图用协议来做同样的事情,例如 (defprotocol foo (bar [f]) (baz [f gs])) 这个编译(至少在REPL中),但任何实现类型似乎都失败了这
使用clojure功能,我可以定义:

(defn f [x & xs] (apply some-function x xs))

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

(defprotocol foo
  (bar [f])
  (baz [f & gs]))

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

这是不支持的,因为Stuart Sierra给出的原因.要进一步详细说明,&符号只在一个解构上下文中是特殊的,例如let或者函数参数.正如斯图尔特所说,defprotocol不是这样的背景.

但&仍然是一个合法的符号,因此您已经定义了一个具有两个功能的协议:bar采用一个参数,名为f,而baz有三个名为f,&和gs的参数.

网友评论