Clojure has an ad hoc hierarchy system. You can define a relationship between any two objects using
(derive ::rect ::shape) (derive ::square ::rect) (derive java.util.Map ::collection)
isa? and § Multiple dispatch in Clojure work with this hierarchy.
- This might be the simplest form of nominal subtyping.