diff options
author | Rich Hickey <richhickey@gmail.com> | 2007-09-29 14:22:35 +0000 |
---|---|---|
committer | Rich Hickey <richhickey@gmail.com> | 2007-09-29 14:22:35 +0000 |
commit | 601a4cb8e03c0471890849580c896961080eacb9 (patch) | |
tree | beb233c9451a21569c88a52d2fc78ad8ea548066 /src | |
parent | 7708963ed3926abfbf84d765f748d2e246e13ace (diff) |
interim checkin
Diffstat (limited to 'src')
-rw-r--r-- | src/boot.clj | 22 | ||||
-rw-r--r-- | src/jvm/clojure/lang/Compiler.java | 39 | ||||
-rw-r--r-- | src/jvm/clojure/lang/RT.java | 176 |
3 files changed, 123 insertions, 114 deletions
diff --git a/src/boot.clj b/src/boot.clj index 2ec96fd8..6ab0474c 100644 --- a/src/boot.clj +++ b/src/boot.clj @@ -6,7 +6,7 @@ ; the terms of this license. ; You must not remove this notice, or any other, from this software. -(in-namespace "clojure") +(in-namespace 'clojure) (def list (fn [& args] args)) (def cons (fn [x seq] (. RT (cons x seq)))) @@ -453,6 +453,10 @@ (let [v (f x)] (lazy-cons v (iterate f v)))) + +(defn merge [& maps] + (reduce conj maps)) + ;; evaluation (defn eval [form] (. clojure.lang.Compiler (eval form))) @@ -463,8 +467,8 @@ (let [c (first classes)] (recur (conj ret (if (instance? c Symbol) - `(= *imports* (assoc *imports* '~c ~(strcat pkg "." c))) - `(= *imports* (assoc *imports* '~(second c) ~(strcat pkg "." (first c)))))) + `(set! *imports* (assoc *imports* '~c ~(strcat pkg "." c))) + `(set! *imports* (assoc *imports* '~(second c) ~(strcat pkg "." (first c)))))) (rest classes))) (cons `do ret)))) @@ -474,15 +478,13 @@ ; (let [v (first names)] ; (recur (conj ret ; (if (instance? v Symbol) -; `(= *refers* (assoc *refers* '~v (the-var ~(. Symbol (intern (str ns) (str v)))))) -; `(= *refers* (assoc *refers* '~(second v) (the-var ~(. Symbol (intern (str ns) (str (first v))))))))) +; `(set! *refers* (assoc *refers* '~v (the-var ~(. Symbol (intern (str ns) (str v)))))) +; `(set! *refers* (assoc *refers* '~(second v) (the-var ~(. Symbol (intern (str ns) (str (first v))))))))) ; (rest names))) ; (cons `do ret)))) -(defn refer-to [export-map] - (= *refers* (conj *refers* export-map))) - - +(defn refer-to [& export-maps] + (set! *refers* (apply merge export-maps))) (defn make-export-map [var-syms] (loop [ret {} @@ -507,7 +509,7 @@ inc dec pos? neg? zero? complement constantly identity seq count peek pop nth contains get - assoc dissoc find keys vals + assoc dissoc find keys vals merge rseq name namespace locking .. defpolyfn defmethod binding find-var ref deref deref! commute set sync diff --git a/src/jvm/clojure/lang/Compiler.java b/src/jvm/clojure/lang/Compiler.java index 3f132751..6757e0be 100644 --- a/src/jvm/clojure/lang/Compiler.java +++ b/src/jvm/clojure/lang/Compiler.java @@ -36,7 +36,7 @@ static final Symbol FN = Symbol.create("fn"); static final Symbol QUOTE = Symbol.create("quote"); static final Symbol THE_VAR = Symbol.create("the-var"); static final Symbol DOT = Symbol.create("."); -static final Symbol ASSIGN = Symbol.create("="); +static final Symbol ASSIGN = Symbol.create("set!"); static final Symbol TRY_FINALLY = Symbol.create("try-finally"); static final Symbol THROW = Symbol.create("throw"); static final Symbol MONITOR_ENTER = Symbol.create("monitor-enter"); @@ -197,18 +197,18 @@ static Symbol resolveSymbol(Symbol sym){ //already qualified or classname? if(sym.ns != null || sym.name.indexOf('.') > 0) return sym; - IPersistentMap imports = (IPersistentMap) RT.IMPORTS.get(); + IPersistentMap imports = (IPersistentMap) ((Var)RT.NS_IMPORTS.get()).get(); //imported class? String className = (String) imports.valAt(sym); if(className != null) return Symbol.intern(null, className); //refers? - IPersistentMap refers = (IPersistentMap) RT.REFERS.get(); + IPersistentMap refers = (IPersistentMap) ((Var)RT.NS_REFERS.get()).get(); Var var = (Var) refers.valAt(sym); if(var != null) return var.sym; - return Symbol.intern(currentNS(), sym.name); + return Symbol.intern(currentNS().name, sym.name); } static class DefExpr implements Expr{ @@ -259,7 +259,7 @@ static class DefExpr implements Expr{ else if(!(RT.second(form) instanceof Symbol)) throw new Exception("Second argument to def must be a Symbol"); Var v = lookupVar((Symbol) RT.second(form), true); - if(!v.sym.ns.equals(currentNS())) + if(!v.sym.ns.equals(currentNS().name)) throw new Exception("Can't create defs outside of current ns"); return new DefExpr(v, analyze(C.EXPRESSION, RT.third(form), v.sym.name), RT.count(form) == 3); } @@ -580,7 +580,7 @@ static abstract class HostExpr implements Expr{ className = sym.name; else { - IPersistentMap imports = (IPersistentMap) RT.IMPORTS.get(); + IPersistentMap imports = (IPersistentMap) ((Var)RT.NS_IMPORTS.get()).get(); className = (String) imports.valAt(sym); } } @@ -1787,7 +1787,7 @@ static class FnExpr implements Expr{ FnMethod enclosingMethod = (FnMethod) METHOD.get(); String basename = enclosingMethod != null ? (enclosingMethod.fn.name + "$") - : (munge(currentNS()) + "."); + : (munge(currentNS().name) + "."); fn.simpleName = (name != null ? munge(name) : ("fn__" + RT.nextID())); @@ -2574,14 +2574,14 @@ static Var lookupVar(Symbol sym, boolean internNew) throws Exception{ else { //is it an alias? - IPersistentMap refers = (IPersistentMap) RT.REFERS.get(); + IPersistentMap refers = (IPersistentMap) ((Var)RT.NS_REFERS.get()).get(); var = (Var) refers.valAt(sym); if(var == null && sym.ns == null) - var = Var.find(Symbol.intern(currentNS(), sym.name)); + var = Var.find(Symbol.intern(currentNS().name, sym.name)); if(var == null && internNew) { //introduce a new var in the current ns - String ns = currentNS(); + String ns = currentNS().name; var = Var.intern(Symbol.intern(ns, sym.name)); } } @@ -2598,8 +2598,8 @@ private static void registerVar(Var var) throws Exception{ VARS.set(RT.assoc(varsMap, var, var)); } -private static String currentNS(){ - return (String) RT.CURRENT_NS.get(); +private static Symbol currentNS(){ + return (Symbol) RT.CURRENT_NS_SYM.get(); } static void closeOver(LocalBinding b, FnMethod method){ @@ -2653,9 +2653,9 @@ public static Object load(InputStream s) throws Exception{ { Var.pushThreadBindings( RT.map(LOADER, new DynamicClassLoader(), - RT.REFERS, RT.REFERS.get(), - RT.IMPORTS, RT.IMPORTS.get(), - RT.CURRENT_NS, RT.CURRENT_NS.get() + RT.NS_REFERS, RT.NS_REFERS.get(), + RT.NS_IMPORTS, RT.NS_IMPORTS.get(), + RT.CURRENT_NS_SYM, RT.CURRENT_NS_SYM.get() )); LineNumberingPushbackReader rdr = new LineNumberingPushbackReader(new InputStreamReader(s)); for(Object r = LispReader.read(rdr, false, EOF, false); r != EOF; r = LispReader.read(rdr, false, EOF, false)) @@ -2688,12 +2688,13 @@ public static void main(String[] args){ try { Var.pushThreadBindings( - RT.map(RT.REFERS, RT.REFERS.get(), - RT.IMPORTS, RT.IMPORTS.get(), - RT.CURRENT_NS, "clojure", + RT.map(RT.NS_REFERS, RT.NS_REFERS.get(), + RT.NS_IMPORTS, RT.NS_IMPORTS.get(), + RT.CURRENT_NS_SYM, RT.CURRENT_NS_SYM.get(), SOURCE, "REPL" )); w.write("Clojure\n"); + RT.inNamespace.invoke(Symbol.create("user")); for(; ;) { @@ -2701,7 +2702,7 @@ public static void main(String[] args){ { Var.pushThreadBindings( RT.map(LOADER, new DynamicClassLoader())); - w.write(RT.CURRENT_NS.get().toString() + "=> "); + w.write(currentNS().name + "=> "); w.flush(); Object r = LispReader.read(rdr, false, EOF, false); if(r == EOF) diff --git a/src/jvm/clojure/lang/RT.java b/src/jvm/clojure/lang/RT.java index 2d277fc3..40bdb854 100644 --- a/src/jvm/clojure/lang/RT.java +++ b/src/jvm/clojure/lang/RT.java @@ -29,98 +29,102 @@ final static Keyword TAG_KEY = Keyword.intern("clojure", "tag"); final static Symbol LOAD_FILE = Symbol.create("clojure", "load-file"); final static Symbol IN_NAMESPACE = Symbol.create("clojure", "in-namespace"); final static Symbol EXPORTS = Symbol.create("clojure", "*exports*"); -final static Var EXPORTS_VAR = Var.intern(EXPORTS,PersistentHashMap.EMPTY); +final static Var EXPORTS_VAR = Var.intern(EXPORTS, PersistentHashMap.EMPTY); final static Symbol EQL_REF = Symbol.create("clojure", "eql-ref?"); -//string -final static Var CURRENT_NS = Var.intern(Symbol.create("clojure", "*current-namespace*"), "clojure"); +//symbol +final static Var CURRENT_NS_SYM = Var.intern(Symbol.create("clojure", "*current-namespace*"), Symbol.create("clojure")); //simple-symbol->fully-qualified-class-name-string -final static Var IMPORTS = Var.intern(Symbol.create("clojure", "*imports*"), - map(Symbol.create("RT"), "clojure.lang.RT", - Symbol.create("Num"), "clojure.lang.Num", - Symbol.create("Symbol"), "clojure.lang.Symbol", - Symbol.create("Keyword"), "clojure.lang.Keyword", - Symbol.create("Var"), "clojure.lang.Var", - Symbol.create("Ref"), "clojure.lang.Ref", - Symbol.create("IFn"), "clojure.lang.IFn", - Symbol.create("IObj"), "clojure.lang.IObj", - Symbol.create("ISeq"), "clojure.lang.ISeq", - Symbol.create("IPersistentCollection"), "clojure.lang.IPersistentCollection", - Symbol.create("IPersistentMap"), "clojure.lang.IPersistentMap", - Symbol.create("IPersistentList"), "clojure.lang.IPersistentList", - Symbol.create("IPersistentVector"), "clojure.lang.IPersistentVector", - Symbol.create("Boolean"), "java.lang.Boolean", - Symbol.create("Byte"), "java.lang.Byte", - Symbol.create("Character"), "java.lang.Character", - Symbol.create("Class"), "java.lang.Class", - Symbol.create("ClassLoader"), "java.lang.ClassLoader", - Symbol.create("Compiler"), "java.lang.Compiler", - Symbol.create("Double"), "java.lang.Double", - Symbol.create("Enum"), "java.lang.Enum", - Symbol.create("Float"), "java.lang.Float", - Symbol.create("InheritableThreadLocal"), "java.lang.InheritableThreadLocal", - Symbol.create("Integer"), "java.lang.Integer", - Symbol.create("Long"), "java.lang.Long", - Symbol.create("Math"), "java.lang.Math", - Symbol.create("Number"), "java.lang.Number", - Symbol.create("Object"), "java.lang.Object", - Symbol.create("Package"), "java.lang.Package", - Symbol.create("Process"), "java.lang.Process", - Symbol.create("ProcessBuilder"), "java.lang.ProcessBuilder", - Symbol.create("Runtime"), "java.lang.Runtime", - Symbol.create("RuntimePermission"), "java.lang.RuntimePermission", - Symbol.create("SecurityManager"), "java.lang.SecurityManager", - Symbol.create("Short"), "java.lang.Short", - Symbol.create("StackTraceElement"), "java.lang.StackTraceElement", - Symbol.create("StrictMath"), "java.lang.StrictMath", - Symbol.create("String"), "java.lang.String", - Symbol.create("StringBuffer"), "java.lang.StringBuffer", - Symbol.create("StringBuilder"), "java.lang.StringBuilder", - Symbol.create("System"), "java.lang.System", - Symbol.create("Thread"), "java.lang.Thread", - Symbol.create("ThreadGroup"), "java.lang.ThreadGroup", - Symbol.create("ThreadLocal"), "java.lang.ThreadLocal", - Symbol.create("Throwable"), "java.lang.Throwable", - Symbol.create("Void"), "java.lang.Void", - Symbol.create("Appendable"), "java.lang.Appendable", - Symbol.create("CharSequence"), "java.lang.CharSequence", - Symbol.create("Cloneable"), "java.lang.Cloneable", - Symbol.create("Iterable"), "java.lang.Iterable", - Symbol.create("Readable"), "java.lang.Readable", - Symbol.create("Runnable"), "java.lang.Runnable", - Symbol.create("Exception"), "java.lang.Exception", - Symbol.create("Collection"), "java.util.Collection", - Symbol.create("Comparator"), "java.util.Comparator", - Symbol.create("Enumeration"), "java.util.Enumeration", - Symbol.create("EventListener"), "java.util.EventListener", - Symbol.create("Formattable"), "java.util.Formattable", - Symbol.create("Iterator"), "java.util.Iterator", - Symbol.create("List"), "java.util.List", - Symbol.create("ListIterator"), "java.util.ListIterator", - Symbol.create("Map"), "java.util.Map", - Symbol.create("Map$Entry"), "java.util.Map$Entry", - Symbol.create("Observer"), "java.util.Observer", - Symbol.create("Queue"), "java.util.Queue", - Symbol.create("RandomAccess"), "java.util.RandomAccess", - Symbol.create("Set"), "java.util.Set", - Symbol.create("SortedMap"), "java.util.SortedMap", - Symbol.create("SortedSet"), "java.util.SortedSet" - )); - +final static IPersistentMap DEFAULT_IMPORTS = map(Symbol.create("RT"), "clojure.lang.RT", + Symbol.create("Num"), "clojure.lang.Num", + Symbol.create("Symbol"), "clojure.lang.Symbol", + Symbol.create("Keyword"), "clojure.lang.Keyword", + Symbol.create("Var"), "clojure.lang.Var", + Symbol.create("Ref"), "clojure.lang.Ref", + Symbol.create("IFn"), "clojure.lang.IFn", + Symbol.create("IObj"), "clojure.lang.IObj", + Symbol.create("ISeq"), "clojure.lang.ISeq", + Symbol.create("IPersistentCollection"), + "clojure.lang.IPersistentCollection", + Symbol.create("IPersistentMap"), "clojure.lang.IPersistentMap", + Symbol.create("IPersistentList"), "clojure.lang.IPersistentList", + Symbol.create("IPersistentVector"), "clojure.lang.IPersistentVector", + Symbol.create("Boolean"), "java.lang.Boolean", + Symbol.create("Byte"), "java.lang.Byte", + Symbol.create("Character"), "java.lang.Character", + Symbol.create("Class"), "java.lang.Class", + Symbol.create("ClassLoader"), "java.lang.ClassLoader", + Symbol.create("Compiler"), "java.lang.Compiler", + Symbol.create("Double"), "java.lang.Double", + Symbol.create("Enum"), "java.lang.Enum", + Symbol.create("Float"), "java.lang.Float", + Symbol.create("InheritableThreadLocal"), + "java.lang.InheritableThreadLocal", + Symbol.create("Integer"), "java.lang.Integer", + Symbol.create("Long"), "java.lang.Long", + Symbol.create("Math"), "java.lang.Math", + Symbol.create("Number"), "java.lang.Number", + Symbol.create("Object"), "java.lang.Object", + Symbol.create("Package"), "java.lang.Package", + Symbol.create("Process"), "java.lang.Process", + Symbol.create("ProcessBuilder"), "java.lang.ProcessBuilder", + Symbol.create("Runtime"), "java.lang.Runtime", + Symbol.create("RuntimePermission"), "java.lang.RuntimePermission", + Symbol.create("SecurityManager"), "java.lang.SecurityManager", + Symbol.create("Short"), "java.lang.Short", + Symbol.create("StackTraceElement"), "java.lang.StackTraceElement", + Symbol.create("StrictMath"), "java.lang.StrictMath", + Symbol.create("String"), "java.lang.String", + Symbol.create("StringBuffer"), "java.lang.StringBuffer", + Symbol.create("StringBuilder"), "java.lang.StringBuilder", + Symbol.create("System"), "java.lang.System", + Symbol.create("Thread"), "java.lang.Thread", + Symbol.create("ThreadGroup"), "java.lang.ThreadGroup", + Symbol.create("ThreadLocal"), "java.lang.ThreadLocal", + Symbol.create("Throwable"), "java.lang.Throwable", + Symbol.create("Void"), "java.lang.Void", + Symbol.create("Appendable"), "java.lang.Appendable", + Symbol.create("CharSequence"), "java.lang.CharSequence", + Symbol.create("Cloneable"), "java.lang.Cloneable", + Symbol.create("Iterable"), "java.lang.Iterable", + Symbol.create("Readable"), "java.lang.Readable", + Symbol.create("Runnable"), "java.lang.Runnable", + Symbol.create("Exception"), "java.lang.Exception", + Symbol.create("Collection"), "java.util.Collection", + Symbol.create("Comparator"), "java.util.Comparator", + Symbol.create("Enumeration"), "java.util.Enumeration", + Symbol.create("EventListener"), "java.util.EventListener", + Symbol.create("Formattable"), "java.util.Formattable", + Symbol.create("Iterator"), "java.util.Iterator", + Symbol.create("List"), "java.util.List", + Symbol.create("ListIterator"), "java.util.ListIterator", + Symbol.create("Map"), "java.util.Map", + Symbol.create("Map$Entry"), "java.util.Map$Entry", + Symbol.create("Observer"), "java.util.Observer", + Symbol.create("Queue"), "java.util.Queue", + Symbol.create("RandomAccess"), "java.util.RandomAccess", + Symbol.create("Set"), "java.util.Set", + Symbol.create("SortedMap"), "java.util.SortedMap", + Symbol.create("SortedSet"), "java.util.SortedSet" +); + +final static Var IMPORTS = Var.intern(Symbol.create("clojure", "*imports*"), DEFAULT_IMPORTS); +final static IFn inNamespace = new AFn(){ + public Object invoke(Object arg1) throws Exception{ + Symbol ns = (Symbol) arg1; + CURRENT_NS_SYM.set(ns); + Var refers = Var.intern(Symbol.intern(ns.name, "*refers*"), EXPORTS_VAR.get()); + Var imports = Var.intern(Symbol.intern(ns.name, "*imports*"), DEFAULT_IMPORTS); + NS_REFERS.set(refers); + NS_IMPORTS.set(imports); + return RT.T; + } +}; //simple-symbol->var final static Var REFERS = Var.intern(Symbol.create("clojure", "*refers*"), map( - IN_NAMESPACE, Var.intern(IN_NAMESPACE, - new AFn(){ - public Object invoke(Object arg1) throws Exception{ - String ns = (String) arg1; - CURRENT_NS.set(ns); - Var.intern(Symbol.intern(ns, "*refers*"), EXPORTS_VAR.get()); - Var.intern(Symbol.intern(ns, "*imports*"), IMPORTS.get()); - return RT.T; - } - }), + IN_NAMESPACE, Var.intern(IN_NAMESPACE, inNamespace), LOAD_FILE, Var.intern(LOAD_FILE, new AFn(){ public Object invoke(Object arg1) throws Exception{ @@ -136,6 +140,8 @@ final static Var REFERS = }) )); +static Var NS_IMPORTS = Var.intern(Symbol.create("clojure", "*ns-imports*"), IMPORTS); +static Var NS_REFERS = Var.intern(Symbol.create("clojure", "*ns-refers*"), REFERS); static public final Object[] EMPTY_ARRAY = new Object[]{}; //static public final Character[] chars; static AtomicInteger id = new AtomicInteger(1); |