summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorRich Hickey <richhickey@gmail.com>2007-09-25 02:52:20 +0000
committerRich Hickey <richhickey@gmail.com>2007-09-25 02:52:20 +0000
commit176a660fb3d4a6136dc342b082288e4f29048dfc (patch)
tree956652738cecfecd83f43d5a0b9a8ef8a213820d /src
parent0b4986c73ce6b158cf21ea48c8aedf774a3d0b7f (diff)
map, filter, reduce
Diffstat (limited to 'src')
-rw-r--r--src/boot.clj35
-rw-r--r--src/jvm/clojure/lang/Compiler.java8
-rw-r--r--src/jvm/clojure/lang/RT.java10
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){