懒惰的评价问题

Osm*_*man 6 clojure

我有这样的代码.我可以在repl中运行它但不能从命令行运行.我想我是一个懒惰的评估问题.


; items.clj

(def items (ref []))

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

(init-items)
(println (first @items))
Run Code Online (Sandbox Code Playgroud)

$ java -jar clojure.jar items.clj
$ nil
Run Code Online (Sandbox Code Playgroud)

问候.

Car*_*icz 4

知道了!

解决方案

Clojure 没有动力运行该map函数,init-items因为没有返回结果。我把它包装成doall强制执行,然后就变了。

  • 实际上 `dorun` 更适合这种情况(`doall` 保留它包装的 seq 的头部并返回它,而 `dorun` 逐步丢弃它并最终返回 `nil` ——因此它更适合 side -有效代码)。 (3认同)