корректировка значений атома, который состоит из списка ссылок - PullRequest
0 голосов
/ 10 мая 2018

У меня есть атом, который должен содержать список ссылок. Как бы я обновить список ссылок внутри атома? Я попробовал следующее, но это не работает.

(def theatom (atom []))
(def mylist [1 2 3 4])

(reset! theatom (map ref mylist))

(swap! theatom (fn [anAtom]
    (map (fn [theRef] (dosync (alter theRef inc))) theatom)
    ))
(println (map deref @theatom))

Идея состоит в том, чтобы увеличить каждое значение ref на единицу. Затем я должен напечатать [2 3 4 5].

1 Ответ

0 голосов
/ 10 мая 2018

У вас это настроено странно. Я думаю, что вы имели в виду:

(swap! theatom (fn [refs]
                 (map (fn [theRef]
                        (dosync (alter theRef inc))
                        theRef) ; Returning the return of dosync "unwraps" the refs
                      refs)))

Хотя это можно сделать немного аккуратнее, используя doseq:

(swap! theatom (fn [refs]
                 (doseq [r refs]
                   (dosync (alter r inc)))
                 refs))

Вы пытались отобразить атом вместо списка, который он содержит. Атомы не повторяемы, поэтому это вызвало бы ошибку.

...