我有一个问题,我的项目在Cider中运行,但在Cider中不能运行。lein run
.
考虑一下core.clj中的这些函数。
(def my-vec ["a" "b" "c"])
(defn dostuff [x] (spit "/home/dirty/file.txt" x :append true))
(defn -main [& args] (map dostuff my-vec))
现在,当我打开Cider repl并输入 (-main)
,这将运行和 file.txt
将包含 "abc..."。然而,如果我用终端进入项目并运行 lein run
它运行片刻,然后关闭。但是 file.txt
是不写给。我忽略了什么?
map
是一个懒惰的序列,它并不是为了产生副作用。如果你想强制实现懒惰序列,你需要将你的 map
在...中 doall
. 首先你不应该使用map,因为你不关心结果的序列。请看 doseq
:
(doseq [x my-vec] (dostuff x))
正如Diego所说,你真正想要的是doseq,尤其是spit只是返回nil,所以map不能给你一个有意义的结果。 你可以通过使用 "mapv "来克服普通的 "map "的懒惰,它就是 不 懒惰,并返回一个向量结果。 试试这个。
(defn -main [& args] (mapv dostuff my-vec))
user=> (-main)
[nil nil nil]
如果你把dostuff改成返回一个值,那么mapv就有意义了。
user=> (defn dostuff [x] (spit "file.txt" x :append true) x )
#'user/dostuff
user=> (-main)
["a" "b" "c"]