summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorRich Hickey <richhickey@gmail.com>2007-07-13 01:55:29 +0000
committerRich Hickey <richhickey@gmail.com>2007-07-13 01:55:29 +0000
commit1b68f771ed620a7fee62551c0959496168b1cd9d (patch)
tree8ec9a973036a4a5ef863c42d1116761f49d11ffd
parentdda99609dbe5b3ef9a831b570c99ee79530f4d0a (diff)
interim checkin
-rw-r--r--clojure.iml1
-rw-r--r--src/jvm/clojure/lang/Compiler.java8
-rw-r--r--src/jvm/clojure/lang/Keyword.java6
-rw-r--r--src/jvm/clojure/lang/PersistentArrayMap.java2
-rw-r--r--src/jvm/clojure/lang/PersistentList.java24
-rw-r--r--src/jvm/clojure/lang/RT.java84
-rw-r--r--src/jvm/clojure/lang/Symbol.java18
7 files changed, 115 insertions, 28 deletions
diff --git a/clojure.iml b/clojure.iml
index 5257eb0f..9b0f11d5 100644
--- a/clojure.iml
+++ b/clojure.iml
@@ -10,6 +10,7 @@
<orderEntry type="inheritedJdk" />
<orderEntry type="sourceFolder" forTests="false" />
<orderEntry type="library" name="asm-2.2.1" level="application" />
+ <orderEntry type="library" name="antlr-3" level="application" />
<orderEntryProperties />
</component>
<component name="VcsManagerConfiguration">
diff --git a/src/jvm/clojure/lang/Compiler.java b/src/jvm/clojure/lang/Compiler.java
index 120a6e06..4da17d4f 100644
--- a/src/jvm/clojure/lang/Compiler.java
+++ b/src/jvm/clojure/lang/Compiler.java
@@ -141,7 +141,7 @@ static String compile(String ns, String className, LineNumberingPushbackReader..
for(ISeq classes = RT.rest(RT.rest(form)); classes != null; classes = classes.rest())
{
String iclassName = classes.first().toString();
- importMap = (IPersistentMap) RT.assoc(iclassName, pkg + "." + iclassName, importMap);
+ importMap = (IPersistentMap) RT.assoc(importMap, iclassName, pkg + "." + iclassName);
}
IMPORTS.set(importMap);
}
@@ -1579,7 +1579,7 @@ private static KeywordExpr registerKeyword(Keyword keyword) throws Exception{
private static void registerVar(TRef var) throws Exception{
IPersistentMap varsMap = (IPersistentMap) VARS.currentVal();
if(RT.get(var, varsMap) == null)
- VARS.set(RT.assoc(var, var, varsMap));
+ VARS.set(RT.assoc(varsMap, var, var));
}
private static void registerFn(FnExpr fn) throws Exception{
@@ -1590,7 +1590,7 @@ static void closeOver(LocalBinding b, FnMethod method){
if(b != null && method != null && RT.get(b, method.locals) == null)
{
b.isClosed = true;
- method.fn.closes = (IPersistentMap) RT.assoc(b, b, method.fn.closes);
+ method.fn.closes = (IPersistentMap) RT.assoc(method.fn.closes, b, b);
closeOver(b, method.parent);
}
}
@@ -1608,7 +1608,7 @@ private static void registerLocal(LocalBinding b) throws Exception{
IPersistentMap localsMap = (IPersistentMap) LOCAL_ENV.currentVal();
//!LOCAL_ENV.setValue(RT.assoc(b.sym, b, localsMap));
FnMethod method = (FnMethod) METHOD.currentVal();
- method.locals = (IPersistentMap) RT.assoc(b, b, method.locals);
+ method.locals = (IPersistentMap) RT.assoc(method.locals, b, b);
}
/*
(defun reference-var (sym)
diff --git a/src/jvm/clojure/lang/Keyword.java b/src/jvm/clojure/lang/Keyword.java
index f9e4a7d5..5be8af38 100644
--- a/src/jvm/clojure/lang/Keyword.java
+++ b/src/jvm/clojure/lang/Keyword.java
@@ -30,8 +30,8 @@ public Keyword(Symbol sym){
this.hash = RT.hashCombine(":".hashCode(), sym.hashCode());
}
-public Keyword(String name, String ns){
- this(new Symbol(name, ns));
+public Keyword(String ns, String name){
+ this(new Symbol(ns, name));
}
public boolean equals(Object o){
@@ -42,7 +42,7 @@ public boolean equals(Object o){
Keyword keyword = (Keyword) o;
- //identity compares ok, names are interned
+ //identity compares intended, names are interned
return sym.equals(keyword.sym);
}
diff --git a/src/jvm/clojure/lang/PersistentArrayMap.java b/src/jvm/clojure/lang/PersistentArrayMap.java
index 2ed368da..773ed158 100644
--- a/src/jvm/clojure/lang/PersistentArrayMap.java
+++ b/src/jvm/clojure/lang/PersistentArrayMap.java
@@ -26,7 +26,7 @@ import java.util.Iterator;
public class PersistentArrayMap extends APersistentMap{
final Object[] array;
-static final int HASHTABLE_THRESHOLD = 42;
+static final int HASHTABLE_THRESHOLD = 16;
public static PersistentArrayMap EMPTY = new PersistentArrayMap();
diff --git a/src/jvm/clojure/lang/PersistentList.java b/src/jvm/clojure/lang/PersistentList.java
index 728cbd10..c597fb33 100644
--- a/src/jvm/clojure/lang/PersistentList.java
+++ b/src/jvm/clojure/lang/PersistentList.java
@@ -16,6 +16,8 @@ private final Object _first;
private final PersistentList _rest;
private final int _count;
+final public static PersistentList EMPTY = new EmptyList(null);
+
public PersistentList(Object first){
this._first = first;
this._rest = null;
@@ -56,4 +58,26 @@ public ISeq cons(Object o){
public PersistentList withMeta(IPersistentMap meta){
return new PersistentList(meta, _first, _rest, _count);
}
+
+static class EmptyList extends PersistentList{
+
+ EmptyList(IPersistentMap meta){
+ super(meta, null, null, 0);
+ }
+
+ public ISeq cons(Object o){
+ return new PersistentList(o, null);
+ }
+
+ public PersistentList withMeta(IPersistentMap meta){
+ if(meta != meta())
+ return new EmptyList(meta);
+ return this;
+ }
+
+ public ISeq seq(){
+ return null;
+ }
+}
+
}
diff --git a/src/jvm/clojure/lang/RT.java b/src/jvm/clojure/lang/RT.java
index 7a23f106..05b27836 100644
--- a/src/jvm/clojure/lang/RT.java
+++ b/src/jvm/clojure/lang/RT.java
@@ -20,6 +20,7 @@ public class RT{
static public Symbol T = new Symbol("t");
final static public TRef OUT = new TRef(new OutputStreamWriter(System.out));
+final static Keyword TAG_KEY = new Keyword("clojure", "tag");
final static public TRef CURRENT_MODULE = new TRef(Module.findOrCreateModule("clojure/user"));
@@ -35,7 +36,6 @@ static
}
-
static public int nextID(){
return id.getAndIncrement();
}
@@ -183,19 +183,19 @@ static public Object get(Object key, Object coll){
return ((Associative) coll).valAt(key);
}
-static public Object assoc(Object key, Object val, Object coll){
+static public Associative assoc(Object coll, Object key, Object val){
if(coll == null)
return new MapEntry(key, val);
return ((Associative) coll).assoc(key, val);
}
-static public Object contains(Object key, Object coll){
+static public Object contains(Object coll, Object key){
if(coll == null)
return false;
return ((Associative) coll).contains(key);
}
-static public Object find(Object key, Object coll){
+static public Object find(Object coll, Object key){
if(coll == null)
return null;
return ((Associative) coll).entryAt(key);
@@ -359,6 +359,14 @@ static public double doubleCast(Object x){
}
+static public IPersistentMap map(Object... init){
+ return new PersistentArrayMap(init);
+}
+
+static public IPersistentArray tuple(Object... init){
+ return PersistentVector.create(init);
+}
+
/**
* **************************************** list support *******************************
*/
@@ -388,24 +396,23 @@ static public ISeq list(Object arg1, Object arg2, Object arg3, Object arg4, Obje
return listStar(arg1, arg2, arg3, arg4, arg5, null);
}
-static public ISeq listStar(Object arg1, ISeq rest) throws Exception{
+static public ISeq listStar(Object arg1, ISeq rest){
return (ISeq) cons(arg1, rest);
}
-static public ISeq listStar(Object arg1, Object arg2, ISeq rest) throws Exception{
+static public ISeq listStar(Object arg1, Object arg2, ISeq rest){
return (ISeq) cons(arg1, cons(arg2, rest));
}
-static public ISeq listStar(Object arg1, Object arg2, Object arg3, ISeq rest) throws Exception{
+static public ISeq listStar(Object arg1, Object arg2, Object arg3, ISeq rest){
return (ISeq) cons(arg1, cons(arg2, cons(arg3, rest)));
}
-static public ISeq listStar(Object arg1, Object arg2, Object arg3, Object arg4, ISeq rest) throws Exception{
+static public ISeq listStar(Object arg1, Object arg2, Object arg3, Object arg4, ISeq rest){
return (ISeq) cons(arg1, cons(arg2, cons(arg3, cons(arg4, rest))));
}
-static public ISeq listStar(Object arg1, Object arg2, Object arg3, Object arg4, Object arg5, ISeq rest)
- throws Exception{
+static public ISeq listStar(Object arg1, Object arg2, Object arg3, Object arg4, Object arg5, ISeq rest){
return (ISeq) cons(arg1, cons(arg2, cons(arg3, cons(arg4, cons(arg5, rest)))));
}
@@ -498,19 +505,29 @@ static public boolean suppressRead(){
return false;
}
+
static public void print(Object x, Writer w) throws Exception{
//todo - make extensible
+ if(x instanceof Obj)
+ {
+ Obj o = (Obj) x;
+ if(o.meta() != null)
+ {
+ IPersistentMap meta = o.meta();
+ w.write("#^");
+ if(meta.count() == 1 && meta.contains(TAG_KEY))
+ print(meta.valAt(TAG_KEY), w);
+ else
+ print(meta, w);
+ w.write(' ');
+ }
+ }
if(x == null)
w.write("null");
else if(x instanceof ISeq)
{
w.write('(');
- for(ISeq s = (ISeq) x; s != null; s = s.rest())
- {
- print(s.first(), w);
- if(s.rest() != null)
- w.write(' ');
- }
+ printInnerSeq(seq(x), w);
w.write(')');
}
else if(x instanceof String)
@@ -519,6 +536,32 @@ static public void print(Object x, Writer w) throws Exception{
w.write(x.toString());
w.write('"');
}
+ else if(x instanceof IPersistentMap)
+ {
+ w.write('{');
+ for(ISeq s = seq(x); s != null; s = s.rest())
+ {
+ IMapEntry e = (IMapEntry) s.first();
+ print(e.key(), w);
+ w.write(' ');
+ print(e.val(), w);
+ if(s.rest() != null)
+ w.write(' ');
+ }
+ w.write('}');
+ }
+ else if(x instanceof IPersistentArray)
+ {
+ IPersistentArray a = (IPersistentArray) x;
+ w.write('[');
+ for(int i = 0; i < a.count(); i++)
+ {
+ print(a.nth(i), w);
+ if(i < a.count() - 1)
+ w.write(' ');
+ }
+ w.write(']');
+ }
else if(x instanceof Character)
{
w.write('\\');
@@ -541,6 +584,15 @@ static public void print(Object x, Writer w) throws Exception{
else w.write(x.toString());
}
+private static void printInnerSeq(ISeq x, Writer w) throws Exception{
+ for(ISeq s = x; s != null; s = s.rest())
+ {
+ print(s.first(), w);
+ if(s.rest() != null)
+ w.write(' ');
+ }
+}
+
static public void formatAesthetic(Writer w, Object obj) throws IOException{
if(obj == null)
w.write("null");
diff --git a/src/jvm/clojure/lang/Symbol.java b/src/jvm/clojure/lang/Symbol.java
index 0b1e1f5b..07ac492c 100644
--- a/src/jvm/clojure/lang/Symbol.java
+++ b/src/jvm/clojure/lang/Symbol.java
@@ -13,10 +13,10 @@
package clojure.lang;
-public class Symbol{
+public class Symbol extends Obj{
//these must be interned strings!
-public final String name;
public final String ns;
+public final String name;
public String toString(){
if(ns != null)
@@ -24,7 +24,7 @@ public String toString(){
return name;
}
-public Symbol(String name, String ns){
+public Symbol(String ns, String name){
this.name = name.intern();
if(ns != null)
this.ns = ns.intern();
@@ -33,7 +33,14 @@ public Symbol(String name, String ns){
}
public Symbol(String name){
- this(name, null);
+ this(null, name);
+}
+
+
+private Symbol(IPersistentMap meta, String ns, String name){
+ super(meta);
+ this.name = name;
+ this.ns = ns;
}
public boolean equals(Object o){
@@ -52,4 +59,7 @@ public int hashCode(){
return RT.hashCombine(name.hashCode(), RT.hash(ns));
}
+public Obj withMeta(IPersistentMap meta){
+ return new Symbol(meta, ns, name);
+}
}