Clojure的map函数是急切求值吗?

6
根据马克的精彩教程页面,“map函数将给定的一个参数函数应用于集合中的每个项,返回结果的惰性序列”。
然而,当我执行以下操作时:
(def input-message-list (range 100 126))

(defn test-123 [in]
  (println "doing " in)
  (str "out " in))

(def output-test (map
                   test-123
                   input-message-list))

(first output-test)

在REPL中,我可以获得println的全部输出结果,而不仅仅是第一个元素!这是怎么回事?
2个回答

7

这个问题已经在这里得到了解答:

实际上每次会评估32个元素

你的范围小于32个元素。


3

这是分块序列的一部分,它真正有助于 Clojure 中“map over lazy seq”模式的性能。这样,您的映射函数会得到更多连续的调用,并且更快地进入 JVM 热点编译器的快速路径。当 Rich 在 2008 年在旧金山演示时,看到这两个代码块以相同的速度运行真是太惊人了:

(reduce + (map inc (range 10000)))

并且

(loop [i 0 sum 0]
   (recur (inc i) (+ sum i)))

现在,您可以编写符合惯用的Clojure语言并获得完全的速度。如果出现问题,则可以在此处关闭它。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接