LINUX.ORG.RU

История изменений

Исправление monk, (текущая версия) :

Определение структур данных, оперирующих ими функций и связей первых со вторыми — всё это тебе придётся делать в любом случае.

Только в ООП я пишу

(defclass tree () (left right))

(defmethod map-tree ((tree tree) f) ...)

(defmethod fold-tree ((tree tree) f init) ...)

(defmethod insert ((tree tree) node) ...)

(defmethod delete ((tree tree) node) ...)

(defclass balanced-tree (tree) ())

(defmethod insert ((balanced-tree balanced-tree) node) ...)

(defmethod delete ((balanced-tree balanced-tree) node) ...)

А с протоколами получается что-то вроде

(defprotocol Tree
  (map-tree [x f])
  (fold-tree [x f i])
  (insert [x n])
  (delete [x n]))

(def DefaultTree
  {:map-tree (fn [x f] ...)
   :fold-tree (fn [x f i] ...)})

(defrecord tree [left right])

(extend tree
  Tree
  (assoc DefaultTree
    :insert (fn [x n] ...)
    :delete (fn [x n] ...)))

(defrecord balanced-tree [left right])

(extend balanced-tree
  Tree
  (assoc DefaultTree
    :insert (fn [x n] ...)
    :delete (fn [x n] ...)))

Плюс, если в ООП я могу писать

(defmethod insert ((balanced-tree balanced-tree) node)
  (call-next-method)
  (rebalance balanced-tree))

то в кложе придётся копипастить.

Исходная версия monk, :

Определение структур данных, оперирующих ими функций и связей первых со вторыми — всё это тебе придётся делать в любом случае.

Толька в ООП я пишу

(defclass tree () (left right))

(defmethod map-tree ((tree tree) f) ...)

(defmethod fold-tree ((tree tree) f init) ...)

(defmethod insert ((tree tree) node) ...)

(defmethod delete ((tree tree) node) ...)

(defclass balanced-tree (tree) ())

(defmethod insert ((balanced-tree balanced-tree) node) ...)

(defmethod delete ((balanced-tree balanced-tree) node) ...)

А с протоколами получается что-то вроде

(defprotocol Tree
  (map-tree [x f])
  (fold-tree [x f i])
  (insert [x n])
  (delete [x n]))

(def DefaultTree
  {:map-tree (fn [x f] ...)
   :fold-tree (fn [x f i] ...)})

(defrecord tree [left right])

(extend tree
  Tree
  (assoc DefaultTree
    :insert (fn [x n] ...)
    :delete (fn [x n] ...)))

(defrecord balanced-tree [left right])

(extend balanced-tree
  Tree
  (assoc DefaultTree
    :insert (fn [x n] ...)
    :delete (fn [x n] ...)))

Плюс, если в ООП я могу писать

(defmethod insert ((balanced-tree balanced-tree) node)
  (call-next-method)
  (rebalance balanced-tree))

то в кложе придётся копипастить.