基本的に遅延シーケンスを作成し続けるマップのソースコードを見ました。コレクションを反復処理して一時的なベクトルに追加する方が高速だと思いますが、明らかにそうではありません。Clojures のパフォーマンス動作について理解できないことはありますか?
;=> (time (do-with / (range 1 1000) (range 1 1000)))
;"Elapsed time: 23.1808 msecs"
;
; vs
;=> (time (doall (map #(/ %1 %2) (range 1 1000) (range 1 1000))))
;"Elapsed time: 2.604174 msecs"
(defn do-with
[fn coll1 coll2]
(let [end (count coll1)]
(loop [i 0
res (transient [])]
(if
(= i end)
(persistent! res)
(let [x (nth coll1 i)
y (nth coll2 i)
r (fn x y)]
(recur (inc i) (conj! res r)))
))))