defmulti vs defprotocol?

wro*_*ame 7 records protocols clojure clojure-1.3

似乎两者都可用于定义稍后可以使用不同数据类型实现的函数.AFAIK的主要区别在于defmulti可以在地图上工作并defprotocol在记录上工作.

还有什么其他差异?使用一个而不是另一个有什么好处?

cor*_*rax 13

简短版本:defmulti更灵活,更通用,同时defprotocol表现更好.

版本略长:

defprotocol 支持类型上的调度,这类似于大多数主流编程语言中的多态.

defmulti是一种更通用的机制,您可以在其中发送除了单一类型之外的其他内容.这种灵活性会带来性能损失.

更多关于协议

有关多方法的更多信息


Art*_*ldt 5

只是为了掩盖动机,corvuscorax的答案很好地涵盖了原始问题.

最初的Clojure只有多方法和花了很多心思很早就进入建设调度抽象,可以处理所有的情况非常好,不会强迫人们围绕结构由语言所提供的抽象的限制他们的抽象.

随着Clojure成熟,创建"clojure in clojure"的愿望需要抽象,至少在理论上能够生成可由java生成的任何字节码,从而需要协议,一种更接近本机Java的调度抽象.
Clojure拥有强大的"拥抱您的平台"理想,协议非常适合这种心态.

  • 一个原因是能够在更高的抽象级别编写Clojure.有点像在C中编写C编译器,而不是在汇编中编写.这样也可以使ClojureScript更容易,并且可以更容易地使Clojure的CLR端口与JVM版本保持同步.另外,它以Gödel,Escher,Bach-ish的方式呈现出酷炫优雅:-) (3认同)