summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorRich Hickey <richhickey@gmail.com>2008-01-25 01:55:15 +0000
committerRich Hickey <richhickey@gmail.com>2008-01-25 01:55:15 +0000
commit755aee1231b268a3fafb1f385af83156938f940c (patch)
tree5310f7733a54f4c5878843213d5ddfc2949bd695
parent36868a7734f15c51eb1831aa9d72a14544496987 (diff)
interim checkin, do not use
-rw-r--r--src/boot.clj20
-rw-r--r--src/jvm/clojure/lang/Compiler.java109
-rw-r--r--src/jvm/clojure/lang/Namespace.java24
-rw-r--r--src/jvm/clojure/lang/RT.java79
-rw-r--r--src/jvm/clojure/lang/Var.java17
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;
}