diff options
author | Rich Hickey <richhickey@gmail.com> | 2007-09-25 02:52:20 +0000 |
---|---|---|
committer | Rich Hickey <richhickey@gmail.com> | 2007-09-25 02:52:20 +0000 |
commit | 176a660fb3d4a6136dc342b082288e4f29048dfc (patch) | |
tree | 956652738cecfecd83f43d5a0b9a8ef8a213820d /src | |
parent | 0b4986c73ce6b158cf21ea48c8aedf774a3d0b7f (diff) |
map, filter, reduce
Diffstat (limited to 'src')
-rw-r--r-- | src/boot.clj | 35 | ||||
-rw-r--r-- | src/jvm/clojure/lang/Compiler.java | 8 | ||||
-rw-r--r-- | src/jvm/clojure/lang/RT.java | 10 |
3 files changed, 48 insertions, 5 deletions
diff --git a/src/boot.clj b/src/boot.clj index feb835f2..3726a5bb 100644 --- a/src/boot.clj +++ b/src/boot.clj @@ -318,3 +318,38 @@ `(. clojure.lang.LockingTransaction (runInTransaction (fn [] ~@body)))) +; sequence fns +(defn every [pred coll] + (if (seq coll) + (and (pred (first coll)) + (recur pred (rest coll))) + t)) + +(defn map + ([f coll] + (if (seq coll) + (lazy-cons (f (first coll)) (map f (rest coll))) + nil)) + ([f coll & colls] + (if (and (seq coll) (every seq colls)) + (lazy-cons (apply f (first coll) (map first colls)) + (apply map f (rest coll) (map rest colls))) + nil))) + +(defn filter [f coll] + (if (seq coll) + (let [v (f (first coll))] + (if v + (lazy-cons (first coll) (filter f (rest coll))) + (recur f (rest coll)))) + nil)) + +(defn reduce + ([f coll] + (if (seq coll) + (thisfn f (rest coll) (first coll)) + (f))) + ([f coll val] + (if (seq coll) + (recur f (rest coll) (f val (first coll))) + val)))
\ No newline at end of file diff --git a/src/jvm/clojure/lang/Compiler.java b/src/jvm/clojure/lang/Compiler.java index 877c20a1..b0c9c8d0 100644 --- a/src/jvm/clojure/lang/Compiler.java +++ b/src/jvm/clojure/lang/Compiler.java @@ -2667,6 +2667,7 @@ public static void main(String[] args){ //repl LineNumberingPushbackReader rdr = new LineNumberingPushbackReader(new InputStreamReader(System.in)); OutputStreamWriter w = new OutputStreamWriter(System.out); + Object EOF = new Object(); try { @@ -2676,6 +2677,7 @@ public static void main(String[] args){ RT.CURRENT_NS, RT.CURRENT_NS.get(), SOURCE, "REPL" )); + w.write("Clojure\n"); for(; ;) { @@ -2693,7 +2695,7 @@ public static void main(String[] args){ w.write('\n'); //w.flush(); } - catch(Exception e) + catch(Throwable e) { e.printStackTrace(); } @@ -2703,6 +2705,10 @@ public static void main(String[] args){ } } } + catch(Exception e) + { + e.printStackTrace(); + } finally { Var.popThreadBindings(); diff --git a/src/jvm/clojure/lang/RT.java b/src/jvm/clojure/lang/RT.java index 765e704e..844e911d 100644 --- a/src/jvm/clojure/lang/RT.java +++ b/src/jvm/clojure/lang/RT.java @@ -235,9 +235,10 @@ static public ISeq cons(Object x, ISeq y){ } static public Object first(Object x){ - if(x == null) + ISeq seq = seq(x); + if(seq == null) return null; - return seq(x).first(); + return seq.first(); } static public Object second(Object x){ @@ -253,9 +254,10 @@ static public Object fourth(Object x){ } static public ISeq rest(Object x){ - if(x == null) + ISeq seq = seq(x); + if(seq == null) return null; - return seq(x).rest(); + return seq.rest(); } static public ISeq rrest(Object x){ |