Я решил попробовать написать программу симуляции в Clojure (как подтверждение концепции), где:
- Все состояние симуляции хранится в одной неизменной структуре данных
- Обновления состояний представлены в виде функций, которые отображают состояние в следующее состояние
Это означает, что я мог бы написать функцию обновления как что-то вроде:
(defn example-update-function [old-state]
(let [state (atom old-state)]
(swap! state some-other-update-function-1)
(if (some-condition @state)
(swap! state some-conditional-update-function))
(swap! state some-other-update-function-2)
(reset! state (some-function @state some-other-param))
@state))
Кажется, что подход работает, но следующее вызывает у меня две причины для беспокойства:
- Мне приходится использовать изменяемый атом для управления промежуточными состояниями ... кажется, не очень функциональным!
- Код кажется немного уродливым со всеми разыменованиями swap! S и @state.
Есть ли лучший / более элегантный подход?