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