LINUX.ORG.RU

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

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

Когда применяются на практике defrecord и deftype

Когда нужен привычный полиморфизм (с диспетчеризацией по типу первого аргумента). Например, мы делаем робокота и хотим, чтобы он мяукал как настоящий — нужно создать тип, реализующий существующий протокол (интерфейс) Catlike с методом meow.

Допустим, есть

(defprotocol Catlike
  (meow [_] "Make the dumb human dwim (do what I mean)."))

(defrecord Cat [name]
  Catlike
  (meow [this] (str name " says: Meow!")))

просто добавляем

(defrecord Robocat [name charge]
  Catlike
  (meow [this] (str name " says: please do the right thing right now, or be electrically cuted!"))

и потом

(def my-pet (atom (->Robocat "Jimi")))
(meow @my-pet)

Если такое мяуканье нам не по душе, мы можем выкинуть наглую механическую морду на мороз и завести себе шерстяную:

(reset! my-pet (->Cat "Lizzie"))
(meow @my-pet)

Если нужно какое-то общее поведение для всех мяукающих, можно вынести его в отдельный тип и организовать типы в иерархию.

аналогичный вопрос на самом деле на счёт vars, atoms, agents, refs

Это для явного управления различными видами состояния (последовательности значений во времени).

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

Когда применяются на практике defrecord и deftype

Когда нужен привычный полиморфизм (с диспетчеризацией по типу первого аргумента). Например, мы делаем робокота и хотим, чтобы он мяукал как настоящий — нужно создать тип, реализующий существующий протокол (интерфейс) Catlike с методом meow.

Допустим, есть

(defprotocol Catlike
  (meow [_] "Make the dumb human dwim (do what I mean)."))

(defrecord Cat [name]
  Catlike
  (meow [this] (str name " says: Meow!")))

просто добавляем

(defrecord Robocat [name charge]
  Catlike
  (meow [this] (str name " says: please do the right thing right now, or be electrically cuted!"))

и потом

(def my-pet (atom (->Robocat "Jimi")))
(meow @my-pet)

Если такое мяуканье нам не по душе, мы можем выкинуть наглую механическую морду на мороз и завести себе шерстяную:

(reset! my-pet (->Cat "Lizzie"))
(meow @my-pet)

Если нужно какое-то общее поведение для всех мяукающих, можно вынести его в отдельный тип и организовать типы в иерархию.

аналогичный вопрос на самом деле на счёт vars, atoms, agents, refs

Это для явного управления различными видами состояния (последовательности значений во времени).