【问题标题】:Clojure map runs in cider, but not lein runClojure 地图在苹果酒中运行,但不是 lein 运行
【发布时间】:2014-07-07 22:41:48
【问题描述】:

我的项目在 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 没有被写入。我忽略了什么?

【问题讨论】:

  • 不确定是否可以在没有更多上下文的情况下回答这个问题 - project.clj,以及至少来自您的 core.cljns 声明。
  • 恐怕实际的project.clj、ns、core.clj都无法分享。因此,如果没有他们,您将无法提供帮助,无论如何,谢谢。
  • 嘿。实际上,看起来@diego 搞定了。也就是说,对于未来,StackOverflow 的政策是强烈推荐带有 SSCCE(“简短、独立、正确的示例”)的问题,尽管确实,删除不需要重现以实现“短的”。运行不完整的东西不是独立的或正确的。请参阅sscce.org(由相关的 SO close 原因链接)以进行更长时间的讨论。
  • 谢谢,无论如何我通常都能得到我想要的东西。

标签: clojure leiningen


【解决方案1】:

map 是一个惰性序列,它不是为了产生副作用。如果要强制实现惰性序列,则需要将map 包装在doall 中。首先,您不应该为此使用 map ,因为您不关心结果序列。见doseq

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

【讨论】:

    【解决方案2】:

    正如 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"]
    

    【讨论】:

      猜你喜欢
      • 2014-11-28
      • 1970-01-01
      • 2023-03-08
      • 1970-01-01
      • 2014-11-13
      • 2011-03-21
      • 1970-01-01
      • 2014-12-14
      • 2019-03-14
      相关资源
      最近更新 更多