Классы / Наследование

;; Clojure has no classes and no inheritance at all.
;; what a base class declares, a PROTOCOL declares here
(defprotocol Shape
  (line-count [this])
  (area [this]))

;; a record implements the protocol instead of extending a class
(defrecord Square [side]
  Shape
  (line-count [_] 4)
  (area [_] (* side side)))

(def square (->Square 5))
;; (line-count square) is 4

(println "line-count is" (line-count square))
(println "area is" (area square))