Они имеют одно и то же имя, и понятия связаны между собой, однако протоколы Clojure носят более общий характер и предназначены для решения «проблемы выражения». Это видео очень интересно смотреть .
Протоколы Objective C больше похожи на интерфейсы Java / C # - они определяют набор методов, которые может реализовать конкретный класс. Однако вы должны предоставить эти методы в конкретном классе, что на практике обычно означает, что вы контролируете исходный код расширяемого класса.
Протоколы Clojure позволяют вам определять набор функций, которые расширяются для обработки любого класса полиморфным образом , и вы можете предоставлять реализации отдельно, даже если вы не контролируете класс, который вы расширяете.
Пример расширения протокола Clojure, например, на класс java.lang.String (которым вы определенно не управляете!), А также на специальное значение nil (т.е. нулевое значение):
;; define a protocol with one function
(defprotocol FooProtocol
(foo [this]))
;; extend the protocol to String and nil
(extend-protocol FooProtocol
java.lang.String
(foo [some-string] (str "Called foo on String: " some-string))
nil
(foo [_] "Called foo on nil value"))
(foo "hello")
=> "Called foo on String: hello"
(foo nil)
=> "Called foo on nil value"