Clojure - когда атом разыменовывается? - PullRequest
0 голосов
/ 18 ноября 2018

Меня смущает, когда атомы разыменовываются в Clojure. Далее у меня есть функция server-request, которая получает данные и обновляет request-result-data, которая является просто картой, индексированной по идентификатору запроса. Функция блокируется до тех пор, пока сервер не завершит отправку данных, и не вернет идентификатор запроса. Первый фрагмент ниже работает как положено. Второе - нет, потому что (кажется) @ request-result-data разыменовывается перед возвратом функции.

;works
(let [req-id (server-request "parameters")]
  (pprint (@request-result-data req-id)))

;returns nil
(pprint (@request-result-data (server-request "parameters"))))

Это нормальное поведение? Есть ли лучший способ закодировать это? Интуитивно кажется, что мне не нужно let здесь.

Спасибо,

1 Ответ

0 голосов
/ 18 ноября 2018

Если функция server-request модифицирует атом request-result-data, то, безусловно, вам нужно использовать первую форму, чтобы убедиться, что все происходит в правильном порядке. Если у вас есть вызов функции (E1 E2), вам не следует полагаться на то, что E1 или E2 будут оцениваться в каком-то конкретном порядке.

Без какого-либо другого контекста я бы удивился, почему вы не можете server-request вернуть информацию вместо того, чтобы поместить ее в атом, но это выходит за рамки вашего первоначального вопроса.

...