Я испытываю неожиданную оценку идентичной формы (do ...)
при оценке в функции против оценки в автономном REPL. Вот первый пример:
;Example1
(defn example [req]
(do
(println (-> req :body :text))
(create-message! (-> req :body :text))
(println (map :text (get-messages)))
)
)
(example {:body {:text "text1"}})
Вывод println будет следующим для example1:
text1
()
Вот второй пример:
;Example2
(def req {:body {:text "text1"}})
(do
(println (-> req :body :text))
(create-message! (-> req :body :text))
(println (map :text (get-messages)))
)
Вывод здесь is:
text1
(text1)
Функция create-message! добавляет сообщение в список атомов. Функция get-messages возвращает список атомов.
В первом примере кажется, что результатом второго println является пустой список, а не ожидаемый одноэлементный список, содержащий «text1». Список атомов обновляется, как и ожидалось в обоих примерах. Кажется, что get-сообщения оцениваются перед созданием сообщения! в первом примере (или происходит что-то еще неожиданное).
Что здесь происходит и почему?
РЕДАКТИРОВАТЬ
Вот код для создания message и get-messages
(defn get-messages
([] (get-messages 10))
([length] (get-messages length (jt/instant)))
([length before] (take length (filter #(jt/before? (:timestamp %) before) @domain/messages)))
)
(defn create-message!
[text]
(swap! domain/messages #(cons (domain/->Message (jt/instant) text) %))
)
Вот определение атома сообщений в пространстве имен домена:
(ns chatovic.domain)
(defrecord Message [timestamp text])
(def messages (atom []))