Ленивая проблема оценки - PullRequest
6 голосов
/ 15 июля 2010

У меня есть такой код. Я могу запустить это в repl, но не могу из командной строки. Я полагаю, у меня ленивая проблема с оценкой.


; items.clj

(def items (ref []))

(defn init-items []
  (map
    #(dosync
       (alter items conj %))
    ["foo" "bar" "baz" ] ))

(init-items)
(println (first @items))

$ java -jar clojure.jar items.clj
$ nil

Привет.

Ответы [ 2 ]

4 голосов
/ 15 июля 2010

Некоторые альтернативы:

Если вы просто хотите добавить связку предметов в коллекцию, содержащуюся в ссылке, начинать одну транзакцию с каждого предмета и conj раздавать их по отдельности немного расточительно. Вместо этого вы могли бы сделать

(defn init-items []
  (dosync (alter items into ["foo" "bar" "baz"])))

Если у вас есть причины делать это по принципу «один элемент за шаг», я думаю, что наиболее идиоматичным и удобным подходом в настоящее время будет использование doseq:

(defn init-items []
  (doseq [item ["foo" "bar" "baz"]]
    (dosync (alter items conj item))))

(Или вы можете переместить обертку doseq в dosync и не использовать dosync в теле doseq.)

4 голосов
/ 15 июля 2010

Понял!

решение

У Clojure нет мотивации для запуска функции map в init-items, поскольку результат не возвращается.Я завернул это в doall, чтобы заставить казнить, и до.

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