summaryrefslogtreecommitdiff
path: root/src/jvm/clojure
diff options
context:
space:
mode:
authorRich Hickey <richhickey@gmail.com>2007-09-29 14:22:35 +0000
committerRich Hickey <richhickey@gmail.com>2007-09-29 14:22:35 +0000
commit601a4cb8e03c0471890849580c896961080eacb9 (patch)
treebeb233c9451a21569c88a52d2fc78ad8ea548066 /src/jvm/clojure
parent7708963ed3926abfbf84d765f748d2e246e13ace (diff)
interim checkin
Diffstat (limited to 'src/jvm/clojure')
-rw-r--r--src/jvm/clojure/lang/Compiler.java39
-rw-r--r--src/jvm/clojure/lang/RT.java176
2 files changed, 111 insertions, 104 deletions
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);