diff options
author | Chouser <chouser@n01se.net> | 2009-08-15 22:49:57 -0400 |
---|---|---|
committer | Chouser <chouser@n01se.net> | 2009-08-19 22:40:16 -0400 |
commit | 1abb7a56de1678321054af7fce183184f06974dd (patch) | |
tree | f60ce45580adbe21d5950b52894272e8b6c4db75 /src | |
parent | b6cf1963af6e4e6aa35446aff15d77dcef305855 (diff) |
Add chunked seq support to doseq, v2. Refs #1
Diffstat (limited to 'src')
-rw-r--r-- | src/clj/clojure/core.clj | 64 |
1 files changed, 43 insertions, 21 deletions
diff --git a/src/clj/clojure/core.clj b/src/clj/clojure/core.clj index 4096a6ff..f7f4ee99 100644 --- a/src/clj/clojure/core.clj +++ b/src/clj/clojure/core.clj @@ -1862,27 +1862,49 @@ (if-not exprs [true `(do ~@body)] (let [k (first exprs) - v (second exprs) - seqsym (when-not (keyword? k) (gensym)) - recform (if (keyword? k) recform `(recur (next ~seqsym))) - steppair (step recform (nnext exprs)) - needrec (steppair 0) - subform (steppair 1)] - (cond - (= k :let) [needrec `(let ~v ~subform)] - (= k :while) [false `(when ~v - ~subform - ~@(when needrec [recform]))] - (= k :when) [false `(if ~v - (do - ~subform - ~@(when needrec [recform])) - ~recform)] - :else [true `(loop [~seqsym (seq ~v)] - (when ~seqsym - (let [~k (first ~seqsym)] - ~subform - ~@(when needrec [recform]))))]))))] + v (second exprs)] + (if (keyword? k) + (let [steppair (step recform (nnext exprs)) + needrec (steppair 0) + subform (steppair 1)] + (cond + (= k :let) [needrec `(let ~v ~subform)] + (= k :while) [false `(when ~v + ~subform + ~@(when needrec [recform]))] + (= k :when) [false `(if ~v + (do + ~subform + ~@(when needrec [recform])) + ~recform)])) + (let [seq- (gensym "seq_") + chunk- (with-meta (gensym "chunk_") + {:tag 'clojure.lang.IChunk}) + count- (gensym "count_") + i- (gensym "i_") + recform `(recur (next ~seq-) nil (int 0) (int 0)) + steppair (step recform (nnext exprs)) + needrec (steppair 0) + subform (steppair 1) + recform-chunk + `(recur ~seq- ~chunk- ~count- (unchecked-inc ~i-)) + steppair-chunk (step recform-chunk (nnext exprs)) + subform-chunk (steppair-chunk 1)] + [true + `(loop [~seq- (seq ~v), ~chunk- nil, + ~count- (int 0), ~i- (int 0)] + (if (< ~i- ~count-) + (let [~k (.nth ~chunk- ~i-)] + ~subform-chunk + ~@(when needrec [recform-chunk])) + (when ~seq- + (if (chunked-seq? ~seq-) + (let [c# (chunk-first ~seq-)] + (recur (seq (chunk-rest ~seq-)) c# + (int (count c#)) (int 0))) + (let [~k (first ~seq-)] + ~subform + ~@(when needrec [recform]))))))])))))] (nth (step nil (seq seq-exprs)) 1))) (defn dorun |