Clojure map在苹果酒中运行,但不是lein run

Clojure map在苹果酒中运行,但不是lein run,clojure,leiningen,Clojure,Leiningen,我遇到了一个问题,我的项目在苹果酒中运行,而不是在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
中运行

请考虑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
是一个懒散的序列,并不意味着有副作用。如果要强制实现延迟序列,需要将
映射
包装在
doall
中。首先,您不应该使用map,因为您不关心结果序列。见
doseq

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

map
是一个惰性序列,它并不意味着有副作用。如果要强制实现延迟序列,需要将
映射
包装在
doall
中。首先,您不应该使用map,因为您不关心结果序列。见
doseq

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

正如迭戈所说,您真正想要的是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"]

正如迭戈所说,您真正想要的是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"]

我不确定在没有更多上下文的情况下是否可以回答这个问题--至少是
project.clj
,以及
core.clj
中的
ns
声明。恐怕实际的project.clj、ns和core.clj无法共享。所以如果没有他们你帮不上忙,无论如何谢谢你。事实上,看起来好像是@diego搞定了。也就是说,对于未来,StackOverflow的政策是,带有SSCCE(“简短、独立、正确的示例”)的问题将被强烈推荐,尽管事实上,删除不需要复制的内容以实现“简短”是合适的。某些不够完整的内容无法运行,这是不完整的或不正确的。请参阅(由相关的非常接近的原因链接)以获得更长时间的讨论。谢谢,在任何情况下,我通常都能得到我想要的。我不确定这是否可以在没有更多上下文的情况下得到回答—一个
项目.clj
,以及您的
核心.clj
声明中的
ns
。恐怕实际的项目是这样的。clj,ns,和core.clj无法共享。所以如果没有他们你帮不上忙,无论如何谢谢你。事实上,看起来好像是@diego搞定了。也就是说,对于未来,StackOverflow的政策是,带有SSCCE(“简短、独立、正确的示例”)的问题将被强烈推荐,尽管事实上,删除不需要复制的内容以实现“简短”是合适的。某些不够完整的内容无法运行,这是不完整的或不正确的。请参阅(相关的非常接近的原因)以进行更长时间的讨论。谢谢,在任何情况下,我通常都能得到我想要的。