Это продолжение моего более раннего вопроса .
Я придумал причудливую схему объекта из моего чтения Let Over Lambda и могу думатьиз нет преимуществ по сравнению с протоколами, но хочу получить мнение.Я просто изучаю использование функций и инкапсуляции высшего порядка.
(defn new-person
"Construct a new Person object and return a Map of accessor methods."
[init-first-name init-last-name init-age]
(let [first-name (ref init-first-name)
last-name (ref init-last-name)
age (ref init-age)]
{:get-first-name #(@first-name)
:set-first-name #(dosync (ref-set first-name %1))
:get-last-name #(@last-name)
:set-last-name #(dosync (ref-set last-name %1))
:get-age #(@age)
:set-age #(dosync (ref-set age %1))}))
Я могу использовать объект следующим образом:
(def fred (new-person "fred" "flintstone" 42))
и получить метод доступа следующим образом:
(fred :get-age)
но я не могу понять, как вызвать метод доступа.
Созданный объект является потокобезопасным, поскольку все изменения «экземпляра» происходят в STM.
ОБНОВЛЕНИЕ : Новая и улучшенная версия:
(defn new-person
"Construct a new Person object and return a Map of accessor methods."
[init-first-name init-last-name init-age]
(let [first-name (ref init-first-name)
last-name (ref init-last-name)
age (ref init-age)]
{:first-name
(fn
([] @first-name)
([val] (dosync (ref-set first-name val))))
:last-name
(fn
([] @last-name)
([val] (dosync (ref-set last-name val))))
:age
(fn
([] @age)
([val] (dosync (ref-set age val))))}))