История изменений
Исправление 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))
то в кложе придётся копипастить.