Created
May 24, 2015 16:46
-
-
Save luxbock/a69b0790236aa29a75e0 to your computer and use it in GitHub Desktop.
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
;; Expanding the following expression as far as it can go: | |
(filter even? (range 10)) | |
;; equals | |
(lazy-seq | |
(when-let [s (seq (range 10))] | |
(if (chunked-seq? s) | |
(let [c (chunk-first s), size (count c), b (chunk-buffer size)] | |
(dotimes [i size] | |
(when (even? (.nth c i)) (chunk-append b (.nth c i)))) | |
(chunk-cons (chunk b) (filter even? (chunk-rest s)))) | |
(let [f (first s), r (rest s)] | |
(if (even? f) (cons f (filter even? r)) (filter even? r)))))) | |
;; equals | |
(new clojure.lang.LazySeq | |
(fn [] | |
(when-let | |
[s (. clojure.lang.RT | |
(seq (new clojure.lang.LazySeq | |
#(let [b (clojure.lang.ChunkBuffer. 32) | |
comp (if (let [a (. clojure.lang.Numbers (isZero 1))] | |
(if a a (clojure.lang.Util/equiv 0 10))) | |
not= | |
(if (. clojure.lang.Numbers (isPos 1)) | |
< | |
(if (. clojure.lang.Numbers (isNeg 1)) | |
> | |
nil)))] | |
(loop* [i 0] | |
(if (let [a (< (clojure.lang.RT/count b) 32)] | |
(if a (comp i 10) a)) | |
(do (.add b i) | |
(recur (. clojure.lang.Numbers (add i 1)))) | |
(chunk-cons (.chunk b) (if (comp i 10) (do (range i 10 1))))))))))] | |
(if (instance? clojure.lang.IChunkedSeq s) | |
(let [c (.chunkedFirst s) | |
size (count c) | |
b (clojure.lang.ChunkBuffer. size)] | |
(let [xy (clojure.lang.RT/longCast size)] | |
(loop* [i 0] | |
(if (. clojure.lang.Numbers (lt i xy)) | |
(do | |
(if (if (or (instance? Integer (.nth c i)) | |
(instance? Long (.nth c i)) | |
(instance? clojure.lang.BigInt (.nth c i)) | |
(instance? BigInteger (.nth c i)) | |
(instance? Short (.nth c i)) | |
(instance? Byte (.nth c i))) | |
(. clojure.lang.Numbers | |
(isZero | |
(. clojure.lang.Numbers | |
and | |
(clojure.lang.RT/uncheckedLongCast (.nth c i)) | |
1))) | |
(throw (IllegalArgumentException. (str "Argument must be an integer: " (.nth c i))))) | |
(do (.add b (.nth c i)))) | |
(recur (. clojure.lang.Numbers (unchecked_inc i))))))) | |
(chunk-cons (.chunk b) (filter even? (.chunkedMore s)))) | |
(let [f (. clojure.lang.RT (first s)) | |
r (. clojure.lang.RT (more s))] | |
(if (if (or (instance? Integer f) | |
(instance? Long f) | |
(instance? clojure.lang.BigInt f) | |
(instance? BigInteger f) | |
(instance? Short f) | |
(instance? Byte f)) | |
(. clojure.lang.Numbers | |
(isZero | |
(. clojure.lang.Numbers | |
and | |
(clojure.lang.RT/uncheckedLongCast f) | |
1))) | |
(throw (IllegalArgumentException. (str "Argument must be an integer: " f))) ) | |
(. clojure.lang.RT (cons f (filter even? r))) | |
(filter even? r))))))) |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment