Почему результаты оценки различаются для самостоятельной и функциональной работы в ближайшем будущем? - PullRequest
0 голосов
/ 03 мая 2020

Я испытываю неожиданную оценку идентичной формы (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 []))

1 Ответ

0 голосов
/ 04 мая 2020

Похоже, что ваш код использует (jt/instant) для фильтрации сообщений, возвращаемых вашим атомом, и это может привести к различным результатам между вызовами из-за чувствительности ко времени.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...