以下表达式打印 {{1234}} 并返回 {{1}}
(first (mapcat #(do (print %) [%]) '(1 2 3 4 5 6 7)))
原因是 {{(apply concat args)}} 在其参数中不是尽可能的惰性,实际上在返回第一个项目之前会实现前四个。这对于一个变长 {{concat}} 来说是本质不可避免的。
这可以在 {{mapcat}} 中修复,或者通过添加一个新的函数(到 {{clojure.core}}?)来修复,这个函数是 {{concat}} 的非变长等效,并用它重新实现 {{mapcat}}
(defn join "惰性地将序列-of-序列连接成一个扁平序列。" [s] (lazy-seq (when-let [[x & xs] (seq s)] (concat x (join xs)))))