diff options
author | Rich Hickey <richhickey@gmail.com> | 2007-07-13 01:55:29 +0000 |
---|---|---|
committer | Rich Hickey <richhickey@gmail.com> | 2007-07-13 01:55:29 +0000 |
commit | 1b68f771ed620a7fee62551c0959496168b1cd9d (patch) | |
tree | 8ec9a973036a4a5ef863c42d1116761f49d11ffd | |
parent | dda99609dbe5b3ef9a831b570c99ee79530f4d0a (diff) |
interim checkin
-rw-r--r-- | clojure.iml | 1 | ||||
-rw-r--r-- | src/jvm/clojure/lang/Compiler.java | 8 | ||||
-rw-r--r-- | src/jvm/clojure/lang/Keyword.java | 6 | ||||
-rw-r--r-- | src/jvm/clojure/lang/PersistentArrayMap.java | 2 | ||||
-rw-r--r-- | src/jvm/clojure/lang/PersistentList.java | 24 | ||||
-rw-r--r-- | src/jvm/clojure/lang/RT.java | 84 | ||||
-rw-r--r-- | src/jvm/clojure/lang/Symbol.java | 18 |
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); +} } |