HomeMathEmailBlogGitHub

Defprotocol

2023-06-02

defprotocol is Clojure's strategy for allowing dynamic polymorphism.

When using defprotocol, implementations of functions are not included.

(defprotocol GameObject 
  (update-obj [this]))

Here, we create a protocol named GameObject and define a function update-obj but do not implement it.

Now we can create types that derive from GameObject:

(deftype Player [] 
  GameObject
  (update-obj [this] "update player stuff"))

(deftype LightSource []
  GameObject
  (update-obj [this] "update light source stuff"))

We can now call update-obj polymorphically on Player or LightSource

(update-obj (Player.))      ;=> "update player stuff"
(update-obj (LightSource.)) ;=> "update light source stuff"