diff options
author | Rich Hickey <richhickey@gmail.com> | 2009-01-08 01:17:23 +0000 |
---|---|---|
committer | Rich Hickey <richhickey@gmail.com> | 2009-01-08 01:17:23 +0000 |
commit | d799f3878f483f6c207387ffc5c567f6132d7c23 (patch) | |
tree | 6499a1b0b91e7781f9a34d333d3ee1532be49fc1 /src | |
parent | 59f0b4054666b684a16500c84f51134f099a0191 (diff) |
fix range with too large negative index, patch from Olov Lassus
made Range implement count()
Diffstat (limited to 'src')
-rw-r--r-- | src/clj/clojure/core.clj | 6 | ||||
-rw-r--r-- | src/jvm/clojure/lang/Range.java | 6 |
2 files changed, 9 insertions, 3 deletions
diff --git a/src/clj/clojure/core.clj b/src/clj/clojure/core.clj index 41a6aab4..93cc31ad 100644 --- a/src/clj/clojure/core.clj +++ b/src/clj/clojure/core.clj @@ -1464,10 +1464,12 @@ (defn range "Returns a lazy seq of nums from start (inclusive) to end (exclusive), by step, where start defaults to 0 and step to 1." - ([end] (if (and (> end 0) (< end (. Integer MAX_VALUE))) + ([end] (if (and (> end 0) (<= end (. Integer MAX_VALUE))) (new clojure.lang.Range 0 end) (take end (iterate inc 0)))) - ([start end] (if (and (< start end) (< end (. Integer MAX_VALUE))) + ([start end] (if (and (< start end) + (>= start (. Integer MIN_VALUE)) + (<= end (. Integer MAX_VALUE))) (new clojure.lang.Range start end) (take (- end start) (iterate inc start)))) ([start end step] diff --git a/src/jvm/clojure/lang/Range.java b/src/jvm/clojure/lang/Range.java index 8785f970..226a77ba 100644 --- a/src/jvm/clojure/lang/Range.java +++ b/src/jvm/clojure/lang/Range.java @@ -59,7 +59,11 @@ public Object reduce(IFn f, Object start) throws Exception{ return ret; } -public IStream stream() throws Exception { +public int count() { + return end - n; + } + + public IStream stream() throws Exception { final AtomicInteger an = new AtomicInteger(n); return new IStream(){ public Object next() throws Exception { |