diff options
author | Rich Hickey <richhickey@gmail.com> | 2008-01-25 01:55:15 +0000 |
---|---|---|
committer | Rich Hickey <richhickey@gmail.com> | 2008-01-25 01:55:15 +0000 |
commit | 755aee1231b268a3fafb1f385af83156938f940c (patch) | |
tree | 5310f7733a54f4c5878843213d5ddfc2949bd695 | |
parent | 36868a7734f15c51eb1831aa9d72a14544496987 (diff) |
interim checkin, do not use
-rw-r--r-- | src/boot.clj | 20 | ||||
-rw-r--r-- | src/jvm/clojure/lang/Compiler.java | 109 | ||||
-rw-r--r-- | src/jvm/clojure/lang/Namespace.java | 24 | ||||
-rw-r--r-- | src/jvm/clojure/lang/RT.java | 79 | ||||
-rw-r--r-- | src/jvm/clojure/lang/Var.java | 17 |
5 files changed, 148 insertions, 101 deletions
diff --git a/src/boot.clj b/src/boot.clj index 06fa0fc9..be62d4e3 100644 --- a/src/boot.clj +++ b/src/boot.clj @@ -693,10 +693,10 @@ (. ns (importClass c (. Class (forName (strcat pkg "." c)))))) ) (apply thisfn (rest import-lists)))) -(defn unimport [& names] - (let [#^clojure.lang.Var imps *ns-imports*] - (doseq name names - (. imps (bindRoot (dissoc (. imps (get)) name)))))) +;(defn unimport [& names] +; (let [#^clojure.lang.Var imps *ns-imports*] +; (doseq name names +; (. imps (bindRoot (dissoc (. imps (get)) name)))))) (defn refer [& refer-lists] (doseq rlist refer-lists @@ -716,10 +716,10 @@ (. refers (bindRoot (assoc (. refers (get)) name var)))) (throw (new Exception (strcat "Can't find Var: " varsym))))))))) -(defn unrefer [& names] - (let [#^clojure.lang.Var refers *ns-refers*] - (doseq name names - (. refers (bindRoot (dissoc (. refers (get)) name)))))) +;(defn unrefer [& names] +; (let [#^clojure.lang.Var refers *ns-refers*] +; (doseq name names +; (. refers (bindRoot (dissoc (. refers (get)) name)))))) ;(defn unintern [varsym] ; (. clojure.lang.Var (unintern varsym))) @@ -1025,7 +1025,9 @@ zipmap cycle split-at split-with repeat replicate iterate range doseq dotimes into - eval import unimport refer unrefer in-namespace + eval import + ;unimport + refer unrefer in-namespace ;unintern into-array array make-proxy implement diff --git a/src/jvm/clojure/lang/Compiler.java b/src/jvm/clojure/lang/Compiler.java index 89d6e1a5..a1366585 100644 --- a/src/jvm/clojure/lang/Compiler.java +++ b/src/jvm/clojure/lang/Compiler.java @@ -139,6 +139,7 @@ static a[MAX_POSITIONAL_ARITY] = Type.getType("[LObject;"); ARG_TYPES[MAX_POSITIONAL_ARITY] = a; + } @@ -222,7 +223,7 @@ static Symbol resolveSymbol(Symbol sym){ if(o == null) return Symbol.intern(currentNS().name.name, sym.name); else if(o instanceof Class) - return Symbol.intern(null, ((Class)o).getName()); + return Symbol.intern(null, ((Class) o).getName()); else if(o instanceof Var) { Var v = (Var) o; @@ -230,17 +231,6 @@ static Symbol resolveSymbol(Symbol sym){ } return null; -// 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) ((Var) RT.NS_REFERS.get()).get(); -// Var var = (Var) refers.valAt(sym); -// if(var != null) -// return var.sym; - } static class DefExpr implements Expr{ @@ -718,28 +708,29 @@ static abstract class HostExpr implements Expr{ c = Class.forName((String) form); return c; } -/* - private static String maybeClassName(Object form, boolean stringOk){ - String className = null; - if(form instanceof Symbol) - { - Symbol sym = (Symbol) form; - if(sym.ns == null) //if ns-qualified can't be classname - { - if(sym.name.indexOf('.') > 0 || sym.name.charAt(0) == '[') - className = sym.name; - else - { - IPersistentMap imports = (IPersistentMap) ((Var) RT.NS_IMPORTS.get()).get(); - className = (String) imports.valAt(sym); - } - } - } - else if(stringOk && form instanceof String) - className = (String) form; - return className; - } -*/ + + /* + private static String maybeClassName(Object form, boolean stringOk){ + String className = null; + if(form instanceof Symbol) + { + Symbol sym = (Symbol) form; + if(sym.ns == null) //if ns-qualified can't be classname + { + if(sym.name.indexOf('.') > 0 || sym.name.charAt(0) == '[') + className = sym.name; + else + { + IPersistentMap imports = (IPersistentMap) ((Var) RT.NS_IMPORTS.get()).get(); + className = (String) imports.valAt(sym); + } + } + } + else if(stringOk && form instanceof String) + className = (String) form; + return className; + } + */ static Class tagToClass(Symbol tag) throws Exception{ Class c = maybeClass(tag, true); if(c != null) @@ -769,7 +760,8 @@ static class InstanceFieldExpr extends FieldExpr implements AssignableExpr{ this.line = line; if(field == null && RT.booleanCast(RT.WARN_ON_REFLECTION.get())) { - System.err.format("Reflection warning, line: %d - reference to field %s can't be resolved.\n", line, fieldName); + System.err.format("Reflection warning, line: %d - reference to field %s can't be resolved.\n", line, + fieldName); } } @@ -2326,7 +2318,8 @@ static class FnExpr implements Expr{ final static Method kwintern = Method.getMethod("clojure.lang.Keyword intern(String, String)"); final static Method symcreate = Method.getMethod("clojure.lang.Symbol create(String)"); - final static Method varintern = Method.getMethod("clojure.lang.Var intern(clojure.lang.Symbol, clojure.lang.Symbol)"); + final static Method varintern = + Method.getMethod("clojure.lang.Var intern(clojure.lang.Symbol, clojure.lang.Symbol)"); final static Method afnctor = Method.getMethod("void <init>()"); final static Method restfnctor = Method.getMethod("void <init>(int)"); final static Type aFnType = Type.getType(AFn.class); @@ -3147,13 +3140,47 @@ private static Expr analyzeSymbol(Symbol sym) throws Exception{ if(b != null) return new LocalBindingExpr(b, tag); } - Var v = lookupVar(sym, false); - if(v != null) + //Var v = lookupVar(sym, false); +// Var v = lookupVar(sym, false); +// if(v != null) +// return new VarExpr(v, tag); + Object o = resolve(sym); + if(o instanceof Var) + { + Var v = (Var) o; + registerVar(v); return new VarExpr(v, tag); + } + else if(o instanceof Class) + return new ClassExpr((Class) o); + throw new Exception("Unable to resolve symbol: " + sym + " in this context"); } +static Object resolve(Symbol sym) throws Exception{ + //note - ns-qualified vars must already exist + if(sym.ns != null) + { + Namespace ns = Namespace.find(Symbol.create(sym.ns)); + if(ns == null) + throw new Exception("No such namespace: " + sym.ns); + Var v = ns.findInternedVar(Symbol.create(sym.name)); + if(v == null) + throw new Exception("No such var: " + sym); + else if(v.ns != currentNS() && !v.isExported()) + throw new Exception("var: " + sym + " is not exported"); + return v; + } + else + { + Object o = currentNS().getMapping(sym); + if(o == null) + throw new Exception("Unable to resolve symbol: " + sym + " in this context"); + return o; + } +} + static Var lookupVar(Symbol sym, boolean internNew) throws Exception{ Var var; @@ -3265,7 +3292,7 @@ public static Object load(Reader rdr) throws Exception{ RT.map(LOADER, new DynamicClassLoader(), // RT.NS_REFERS, RT.NS_REFERS.get(), // RT.NS_IMPORTS, RT.NS_IMPORTS.get(), - RT.CURRENT_NS, RT.CURRENT_NS.get() +RT.CURRENT_NS, RT.CURRENT_NS.get() )); LineNumberingPushbackReader pushbackReader = (rdr instanceof LineNumberingPushbackReader) ? (LineNumberingPushbackReader) rdr : @@ -3304,8 +3331,8 @@ public static void main(String[] args){ RT.map( // RT.NS_REFERS, RT.NS_REFERS.get(), // RT.NS_IMPORTS, RT.NS_IMPORTS.get(), - RT.CURRENT_NS, RT.CURRENT_NS.get(), - SOURCE, "REPL" +RT.CURRENT_NS, RT.CURRENT_NS.get(), +SOURCE, "REPL" )); w.write("Clojure\n"); RT.inNamespace.invoke(Symbol.create("user")); diff --git a/src/jvm/clojure/lang/Namespace.java b/src/jvm/clojure/lang/Namespace.java index b15ae07c..fb59fba9 100644 --- a/src/jvm/clojure/lang/Namespace.java +++ b/src/jvm/clojure/lang/Namespace.java @@ -42,8 +42,8 @@ Var intern(Symbol sym){ { if(v == null) v = new Var(this, sym); - IPersistentMap newMap = map.assoc(sym,v); - mappings.compareAndSet(map,newMap); + IPersistentMap newMap = map.assoc(sym, v); + mappings.compareAndSet(map, newMap); map = getMappings(); } if(o instanceof Var && ((Var) o).ns == this) @@ -61,8 +61,8 @@ Object reference(Symbol sym, Object val){ Object o; while((o = map.valAt(sym)) == null) { - IPersistentMap newMap = map.assoc(sym,val); - mappings.compareAndSet(map,newMap); + IPersistentMap newMap = map.assoc(sym, val); + mappings.compareAndSet(map, newMap); map = getMappings(); } if(o == val) @@ -71,27 +71,27 @@ Object reference(Symbol sym, Object val){ throw new IllegalStateException(sym + " already refers to: " + o + " in namespace: " + name); } -void unintern(Symbol sym) throws Exception{ +public void unintern(Symbol sym) throws Exception{ if(sym.ns != null) { - throw new IllegalArgumentException("Can't intern namespace-qualified symbol"); + throw new IllegalArgumentException("Can't unintern namespace-qualified symbol"); } IPersistentMap map = getMappings(); while(map.containsKey(sym)) { IPersistentMap newMap = map.without(sym); - mappings.compareAndSet(map,newMap); + mappings.compareAndSet(map, newMap); map = getMappings(); } } public Class importClass(Symbol sym, Class c){ - return (Class) reference(sym,c); + return (Class) reference(sym, c); } public Var refer(Symbol sym, Var var){ - return (Var) reference(sym,var); + return (Var) reference(sym, var); } @@ -100,8 +100,8 @@ public static Namespace findOrCreate(Symbol name){ if(ns != null) return ns; Namespace newns = new Namespace(name); - ns = namespaces.putIfAbsent(name,newns); - return ns == null?newns:ns; + ns = namespaces.putIfAbsent(name, newns); + return ns == null ? newns : ns; } public static Namespace find(Symbol name){ @@ -114,7 +114,7 @@ public Object getMapping(Symbol name){ public Var findInternedVar(Symbol symbol){ Object o = mappings.get().valAt(symbol); - if(o != null && o instanceof Var && ((Var)o).ns == this) + if(o != null && o instanceof Var && ((Var) o).ns == this) return (Var) o; return null; } diff --git a/src/jvm/clojure/lang/RT.java b/src/jvm/clojure/lang/RT.java index fe1767d5..6312eb57 100644 --- a/src/jvm/clojure/lang/RT.java +++ b/src/jvm/clojure/lang/RT.java @@ -46,7 +46,7 @@ Symbol.create("Compiler"), Compiler.class, Symbol.create("Double"), Double.class, Symbol.create("Enum"), Enum.class, Symbol.create("Float"), Float.class, -Symbol.create("InheritableThreadLocal"),InheritableThreadLocal.class, +Symbol.create("InheritableThreadLocal"), InheritableThreadLocal.class, Symbol.create("Integer"), Integer.class, Symbol.create("Long"), Long.class, Symbol.create("Math"), Math.class, @@ -100,30 +100,30 @@ Symbol.create("Exception"), Exception.class static final Namespace CLOJURE_NS = Namespace.findOrCreate(Symbol.create("clojure")); //static final Namespace USER_NS = Namespace.findOrCreate(Symbol.create("user")); final static public Var OUT = - Var.intern(CLOJURE_NS,Symbol.create("*out*"), new OutputStreamWriter(System.out)); + Var.intern(CLOJURE_NS, Symbol.create("*out*"), new OutputStreamWriter(System.out)); final static public Var IN = - Var.intern(CLOJURE_NS,Symbol.create("*in*"), + Var.intern(CLOJURE_NS, Symbol.create("*in*"), new LineNumberingPushbackReader(new InputStreamReader(System.in))); -final static Keyword TAG_KEY = Keyword.intern("clojure","tag"); -final static Keyword AGENT_KEY = Keyword.intern("clojure","agent"); +final static Keyword TAG_KEY = Keyword.intern("clojure", "tag"); +final static Keyword AGENT_KEY = Keyword.intern("clojure", "agent"); //final static public Var CURRENT_MODULE = Var.intern(Symbol.create("clojure", "current-module"), // Module.findOrCreateModule("clojure/user")); final static Symbol LOAD_FILE = Symbol.create("load-file"); final static Symbol IN_NAMESPACE = Symbol.create("in-namespace"); final static Symbol EXPORTS = Symbol.create("*exports*"); -final static Var EXPORTS_VAR = Var.intern(CLOJURE_NS,EXPORTS, PersistentHashMap.EMPTY); +final static Var EXPORTS_VAR = Var.intern(CLOJURE_NS, EXPORTS, PersistentHashMap.EMPTY); final static Symbol EQL_REF = Symbol.create("eql-ref?"); //symbol -final static Var CURRENT_NS = Var.intern(CLOJURE_NS,Symbol.create("*current-namespace*"), - CLOJURE_NS); +final static Var CURRENT_NS = Var.intern(CLOJURE_NS, Symbol.create("*current-namespace*"), + CLOJURE_NS); -final static Var PRINT_META = Var.intern(CLOJURE_NS,Symbol.create("*print-meta*"), F); -final static Var PRINT_READABLY = Var.intern(CLOJURE_NS,Symbol.create("*print-readably*"), T); -final static Var WARN_ON_REFLECTION = Var.intern(CLOJURE_NS,Symbol.create("*warn-on-reflection*"), F); +final static Var PRINT_META = Var.intern(CLOJURE_NS, Symbol.create("*print-meta*"), F); +final static Var PRINT_READABLY = Var.intern(CLOJURE_NS, Symbol.create("*print-readably*"), T); +final static Var WARN_ON_REFLECTION = Var.intern(CLOJURE_NS, Symbol.create("*warn-on-reflection*"), F); -final static Var IMPORTS = Var.intern(CLOJURE_NS,Symbol.create("*imports*"), DEFAULT_IMPORTS); +final static Var IMPORTS = Var.intern(CLOJURE_NS, Symbol.create("*imports*"), DEFAULT_IMPORTS); final static IFn inNamespace = new AFn(){ public Object invoke(Object arg1) throws Exception{ Symbol nsname = (Symbol) arg1; @@ -144,16 +144,16 @@ final static IFn inNamespace = new AFn(){ }; //simple-symbol->var final static Var REFERS = - Var.intern(CLOJURE_NS,Symbol.create("*refers*"), + Var.intern(CLOJURE_NS, Symbol.create("*refers*"), map( - IN_NAMESPACE, Var.intern(CLOJURE_NS,IN_NAMESPACE, inNamespace), - LOAD_FILE, Var.intern(CLOJURE_NS,LOAD_FILE, + IN_NAMESPACE, Var.intern(CLOJURE_NS, IN_NAMESPACE, inNamespace), + LOAD_FILE, Var.intern(CLOJURE_NS, LOAD_FILE, new AFn(){ public Object invoke(Object arg1) throws Exception{ return Compiler.loadFile((String) arg1); } }), - EQL_REF, Var.intern(CLOJURE_NS,EQL_REF, + EQL_REF, Var.intern(CLOJURE_NS, EQL_REF, new AFn(){ public Object invoke(Object arg1, Object arg2) throws Exception{ @@ -171,6 +171,15 @@ static AtomicInteger id = new AtomicInteger(1); static { OUT.setTag(Symbol.create("java.io.OutputStreamWriter")); + try + { + InputStream ins = RT.class.getResourceAsStream("/boot.clj"); + Compiler.load(new InputStreamReader(ins)); + } + catch(Exception e) + { + throw new IllegalStateException("Error loading boot.clj", e); + } } //static // { @@ -725,19 +734,19 @@ static public void print(Object x, Writer w) throws Exception{ char c = s.charAt(i); switch(c) { - case'\n': + case '\n': w.write("\\n"); break; - case'\t': + case '\t': w.write("\\t"); break; - case'\r': + case '\r': w.write("\\r"); break; - case'"': + case '"': w.write("\\\""); break; - case'\\': + case '\\': w.write("\\\\"); break; default: @@ -799,13 +808,13 @@ static public void print(Object x, Writer w) throws Exception{ w.write('\\'); switch(c) { - case'\n': + case '\n': w.write("newline"); break; - case'\t': + case '\t': w.write("tab"); break; - case' ': + case ' ': w.write("space"); break; default: @@ -847,13 +856,13 @@ static public void formatStandard(Writer w, Object obj) throws IOException{ char c = ((Character) obj).charValue(); switch(c) { - case'\n': + case '\n': w.write("newline"); break; - case'\t': + case '\t': w.write("tab"); break; - case' ': + case ' ': w.write("space"); break; default: @@ -884,29 +893,29 @@ static public ISeq doFormat(Writer w, String s, ISeq args) throws Exception{ char c = s.charAt(i++); switch(Character.toLowerCase(c)) { - case'~': + case '~': char d = s.charAt(i++); switch(Character.toLowerCase(d)) { - case'%': + case '%': w.write('\n'); break; - case't': + case 't': w.write('\t'); break; - case'a': + case 'a': if(args == null) throw new IllegalArgumentException("Missing argument"); RT.formatAesthetic(w, RT.first(args)); args = RT.rest(args); break; - case's': + case 's': if(args == null) throw new IllegalArgumentException("Missing argument"); RT.formatStandard(w, RT.first(args)); args = RT.rest(args); break; - case'{': + case '{': int j = s.indexOf("~}", i); //note - does not nest if(j == -1) throw new IllegalArgumentException("Missing ~}"); @@ -916,11 +925,11 @@ static public ISeq doFormat(Writer w, String s, ISeq args) throws Exception{ args = RT.rest(args); i = j + 2; //skip ~} break; - case'^': + case '^': if(args == null) return null; break; - case'~': + case '~': w.write('~'); break; default: diff --git a/src/jvm/clojure/lang/Var.java b/src/jvm/clojure/lang/Var.java index 34ce3b8b..827ed5fc 100644 --- a/src/jvm/clojure/lang/Var.java +++ b/src/jvm/clojure/lang/Var.java @@ -49,6 +49,7 @@ transient final AtomicInteger count; final public Symbol sym; final public Namespace ns; boolean macroFlag = false; +boolean exported = false; Symbol tag; public static Var intern(Namespace ns, Symbol sym, Object root){ @@ -64,7 +65,7 @@ public static Var intern(Namespace ns, Symbol sym, Object root, boolean replaceR public String toString(){ - return "#<Var: " + (ns!=null?(ns.name + "/"):"") + (sym != null ? sym.toString() : "--unnamed--") + ">"; + return "#<Var: " + (ns != null ? (ns.name + "/") : "") + (sym != null ? sym.toString() : "--unnamed--") + ">"; } public static Var find(Symbol nsQualifiedSym){ @@ -78,7 +79,7 @@ public static Var find(Symbol nsQualifiedSym){ public static Var intern(Symbol nsName, Symbol sym){ Namespace ns = Namespace.findOrCreate(nsName); - return intern(ns,sym); + return intern(ns, sym); } public static Var intern(Namespace ns, Symbol sym){ @@ -87,7 +88,7 @@ public static Var intern(Namespace ns, Symbol sym){ public static Var create(){ - return new Var(null,null); + return new Var(null, null); } public static Var create(Object root){ @@ -102,7 +103,7 @@ Var(Namespace ns, Symbol sym){ } Var(Namespace ns, Symbol sym, Object root){ - this(ns,sym); + this(ns, sym); this.root = root; } @@ -145,6 +146,14 @@ public boolean isMacro(){ return macroFlag; } +public void setExported(boolean state){ + exported = state; +} + +public boolean isExported(){ + return exported; +} + public Object getRoot(){ return root; } |