Just adding to cover motivation, the corvuscorax answer covers the original question.
Initially, Clojure had only multimethods , and very early in the course of many thoughts there was an assembly of abstraction that could handle all cases very well and would not force people to structure their abstractions around the limitation of abstractions offered by the language.
How Clojure matured the desire to create the “clojure in clojure” required abstractions, which, at least in theory, are capable of creating some kind of bytecode that can be created by java and, therefore, the need for protocols , sending abstraction, which is closer to native Java.
Clojure has the strong idea of “hugging your platform,” and the protocols are very well suited for this thinking.
source share