以下表达式打印 {{1234}} 并返回 {{1}}
(first (mapcat #(do (print %) [%]) '(1 2 3 4 5 6 7)))
原因是{{(apply concat args)}}对其参数并不是最懒惰的,并实际上会在返回第一项之前实现前四项。这对于可变参数的{{concat}}来说是基本上不可避免的。
这既可以在mapcat中修复,也可以通过添加一个新的函数(到{{clojure.core}}?)实现,该函数是{{concat}}的非可变参数等效,然后用它重写{{mapcat}}
(defn join " Lazily concatenates a sequence-of-sequences into a flat sequence." [s] (lazy-seq (when-let [[x & xs] (seq s)] (concat x (join xs)))))