Clojure地图可以在苹果酒中运行,但不能在lein中运行。

问题描述 投票:1回答:2

我有一个问题,我的项目在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 是不写给。我忽略了什么?

clojure leiningen
2个回答
6
投票

map 是一个懒惰的序列,它并不是为了产生副作用。如果你想强制实现懒惰序列,你需要将你的 map 在...中 doall. 首先你不应该使用map,因为你不关心结果的序列。请看 doseq:

(doseq [x my-vec] (dostuff x))

0
投票

正如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"]
© www.soinside.com 2019 - 2024. All rights reserved.