【问题标题】:why does clojure's map println only works in repl?为什么clojure的map println只在repl中有效?
【发布时间】:2016-08-22 03:25:05
【问题描述】:

我使用lein new app test-println 创建一个clojure 应用程序并使用lein repl 启动repl,然后我输入(map println [1 2 3 4 5 6]) 并得到预期的结果: test-println.core=> (map println [1 2 3 4 5 6]) 1 2 3 4 5 6 (nil nil nil nil nil nil)

但是,如果我将(map println [1 2 3 4 5 6]) 添加到src/test_println/core.clj 的末尾:

(ns test-println.core
  (:gen-class))

(defn -main
  "I don't do a whole lot ... yet."
  [& args]
  (println "Hello, World!")
  (map println [1 2 3 4 5 6]))

lean run 仅打印 Hello, World!

【问题讨论】:

    标签: clojure


    【解决方案1】:

    map 很懒惰。引用文档的第一句话(强调添加):

    返回一个 惰性序列,其中包含将 f 应用于 每个 coll 的第一项的集合,然后将 f 应用于集合 每个 coll 中的第二个项目,直到任何一个 colls 用完为止。

    REPL 强制对表达式求值以显示结果,但您的代码中没有任何作用。 dorun 可以解决这个问题,但您可能应该查看 doseq / doall

    【讨论】:

      【解决方案2】:

      如果您的目标是对单个集合中的每个项目运行单个过程,则应使用run!

      (run! println [1 2 3 4 5 6])
      ;; 1
      ;; 2
      ;; 3
      ;; 4
      ;; 5
      ;; 6
      ;;=> nil
      

      如果您需要对每个集合执行的操作比简单地应用现有函数更复杂,doseq 可能更方便,但这里run! 是更好的选择。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2022-01-11
        • 1970-01-01
        • 1970-01-01
        • 2012-12-13
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2014-11-20
        相关资源
        最近更新 更多