summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorChouser <chouser@n01se.net>2009-08-15 22:49:57 -0400
committerChouser <chouser@n01se.net>2009-08-19 22:40:16 -0400
commit1abb7a56de1678321054af7fce183184f06974dd (patch)
treef60ce45580adbe21d5950b52894272e8b6c4db75 /src
parentb6cf1963af6e4e6aa35446aff15d77dcef305855 (diff)
Add chunked seq support to doseq, v2. Refs #1
Diffstat (limited to 'src')
-rw-r--r--src/clj/clojure/core.clj64
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