diff options
-rw-r--r-- | src/boot.clj | 73 | ||||
-rw-r--r-- | src/jvm/clojure/lang/Compiler.java | 356 | ||||
-rw-r--r-- | src/jvm/clojure/lang/Namespace.java | 2 | ||||
-rw-r--r-- | src/jvm/clojure/lang/RT.java | 54 |
4 files changed, 259 insertions, 226 deletions
diff --git a/src/boot.clj b/src/boot.clj index be62d4e3..64b765c0 100644 --- a/src/boot.clj +++ b/src/boot.clj @@ -18,6 +18,9 @@ (. (the-var defn) (setMacro)) +(defn instance? [#^Class c x] + (. c (isInstance x))) + (defn vector ([] []) ([& args] @@ -77,7 +80,7 @@ (defn frest [x] (first (rest x))) (defn rrest [x] (rest (rest x))) -(defn #^Boolean eql? [x y] (. clojure.lang.RT (equal x y))) +(defn #^Boolean = [x y] (. clojure.lang.RT (equal x y))) (defn #^String str [#^Object x] (if x (. x (toString)) "")) @@ -488,7 +491,7 @@ (recur ((first fs) ret) (rest fs)) ret))))) -(defn appl +(defn partial ([f arg1] (fn [& args] (apply f arg1 args))) ([f arg1 arg2] @@ -580,7 +583,7 @@ ([end] (take end (iterate inc 0))) ([start end] (take (- end start) (iterate inc start))) ([start end step] - (take-while (appl (if (pos? step) > <) end) (iterate (appl + step) start)))) + (take-while (partial (if (pos? step) > <) end) (iterate (partial + step) start)))) (defn merge [& maps] (reduce conj maps)) @@ -698,23 +701,23 @@ ; (doseq name names ; (. imps (bindRoot (dissoc (. imps (get)) name)))))) -(defn refer [& refer-lists] - (doseq rlist refer-lists - (let [#^clojure.lang.Var refers *ns-refers* - ns (first rlist) - names (rest rlist)] - (doseq name names - (when (. clojure.lang.Var (find (symbol(str *current-namespace*) (str name)))) - (throw (new Exception (strcat "Name conflict: " name " already exists in this namespace")))) - (let [varsym (symbol (str ns) (str name)) - var (. clojure.lang.Var (find varsym)) - #^clojure.lang.Var rvar ((. refers (get)) name)] - (if var - (if rvar - (when (not (eql? rvar var)) - (throw (new Exception (strcat "Name conflict: " name " already exists in this refer map as: " (. rvar sym))))) - (. refers (bindRoot (assoc (. refers (get)) name var)))) - (throw (new Exception (strcat "Can't find Var: " varsym))))))))) +;(defn refer [& refer-lists] +; (doseq rlist refer-lists +; (let [#^clojure.lang.Var refers *ns-refers* +; ns (first rlist) +; names (rest rlist)] +; (doseq name names +; (when (. clojure.lang.Var (find (symbol(str *current-namespace*) (str name)))) +; (throw (new Exception (strcat "Name conflict: " name " already exists in this namespace")))) +; (let [varsym (symbol (str ns) (str name)) +; var (. clojure.lang.Var (find varsym)) +; #^clojure.lang.Var rvar ((. refers (get)) name)] +; (if var +; (if rvar +; (when (not (= rvar var)) +; (throw (new Exception (strcat "Name conflict: " name " already exists in this refer map as: " (. rvar sym))))) +; (. 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*] @@ -738,13 +741,13 @@ (defn make-proxy [classes method-map] (. java.lang.reflect.Proxy - (newProxyInstance (. (class clojure.lang.Compiler) (getClassLoader)) + (newProxyInstance (. (identity clojure.lang.Compiler) (getClassLoader)) (into-array classes) (new clojure.lang.ProxyHandler method-map)))) (defmacro implement [classes & fs] `(make-proxy - ~(apply vector (map (appl list 'class) classes)) + ~classes ~(loop [fmap {} fs fs] (if fs (recur (assoc fmap (name (ffirst fs)) @@ -887,7 +890,7 @@ (. coll (toArray))) (defn to-array-2d [#^java.util.Collection coll] - (let [ret (make-array (class "[Ljava.lang.Object;") (. coll (size)))] + (let [ret (make-array (. Class (forName "[Ljava.lang.Object;")) (. coll (size)))] (loop [i 0 xs (seq coll)] (when xs (aset ret i (to-array (first xs))) @@ -995,15 +998,23 @@ (defn distinct [coll] (keys (to-set coll))) -(def *exports* - '(clojure - load-file load +(defn export [syms] + (doseq sym syms + (.. *current-namespace* (intern sym) (setExported true)))) + +(defn exports [#^clojure.lang.Namespace ns] + (filter (fn [v] (and (instance? clojure.lang.Var v) + (. v (isExported)))) + (vals (. ns (getMappings))))) + +(export + '( load-file load list cons conj defn vector hash-map sorted-map sorted-map-by meta with-meta defmacro when when-not nil? not first rest second ffirst frest rfirst rrest - eql? str strcat gensym cond + = str strcat gensym cond apply list* delay lazy-cons fnseq concat and or + * / - == < <= > >= inc dec pos? neg? zero? quot rem @@ -1019,7 +1030,7 @@ ref deref commute alter set ensure sync ! agent agent-of agent-errors clear-agent-errors await await-for - reduce reverse comp appl + reduce reverse comp partial every? not-every? some not-any? map pmap mapcat filter take take-while drop drop-while zipmap @@ -1027,7 +1038,8 @@ doseq dotimes into eval import ;unimport - refer unrefer in-namespace + ;refer unrefer + in-namespace ;unintern into-array array make-proxy implement @@ -1048,5 +1060,8 @@ *warn-on-reflection* resultset-seq to-set distinct + export exports + identical? instance? + load-file in-namespace )) diff --git a/src/jvm/clojure/lang/Compiler.java b/src/jvm/clojure/lang/Compiler.java index a1366585..7855a281 100644 --- a/src/jvm/clojure/lang/Compiler.java +++ b/src/jvm/clojure/lang/Compiler.java @@ -48,18 +48,17 @@ 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("set!"); -static final Symbol TRY_FINALLY = Symbol.create("try-finally"); +//static final Symbol TRY_FINALLY = Symbol.create("try-finally"); static final Symbol TRY = Symbol.create("try"); static final Symbol CATCH = Symbol.create("catch"); static final Symbol FINALLY = Symbol.create("finally"); static final Symbol THROW = Symbol.create("throw"); static final Symbol MONITOR_ENTER = Symbol.create("monitor-enter"); static final Symbol MONITOR_EXIT = Symbol.create("monitor-exit"); -static final Symbol INSTANCE = Symbol.create("instance?"); -static final Symbol IDENTICAL = Symbol.create("identical?"); +//static final Symbol INSTANCE = Symbol.create("instance?"); static final Symbol THISFN = Symbol.create("thisfn"); -static final Symbol CLASS = Symbol.create("class"); +//static final Symbol CLASS = Symbol.create("class"); static final Symbol NEW = Symbol.create("new"); //static final Symbol UNQUOTE = Symbol.create("unquote"); //static final Symbol UNQUOTE_SPLICING = Symbol.create("unquote-splicing"); @@ -88,17 +87,17 @@ static IPersistentMap specials = RT.map( THE_VAR, new TheVarExpr.Parser(), DOT, new HostExpr.Parser(), ASSIGN, new AssignExpr.Parser(), - TRY_FINALLY, new TryFinallyExpr.Parser(), +// TRY_FINALLY, new TryFinallyExpr.Parser(), TRY, new TryExpr.Parser(), THROW, new ThrowExpr.Parser(), MONITOR_ENTER, new MonitorEnterExpr.Parser(), MONITOR_EXIT, new MonitorExitExpr.Parser(), - INSTANCE, new InstanceExpr.Parser(), - IDENTICAL, new IdenticalExpr.Parser(), +// INSTANCE, new InstanceExpr.Parser(), +// IDENTICAL, new IdenticalExpr.Parser(), THISFN, null, CATCH, null, FINALLY, null, - CLASS, new ClassExpr.Parser(), +// CLASS, new ClassExpr.Parser(), NEW, new NewExpr.Parser(), // UNQUOTE, null, // UNQUOTE_SPLICING, null, @@ -1355,7 +1354,7 @@ static class MonitorEnterExpr extends UntypedExpr{ static class Parser implements IParser{ public Expr parse(C context, Object form) throws Exception{ - return analyze(C.EXPRESSION, RT.second(form)); + return new MonitorEnterExpr(analyze(C.EXPRESSION, RT.second(form))); } } } @@ -1382,7 +1381,7 @@ static class MonitorExitExpr extends UntypedExpr{ static class Parser implements IParser{ public Expr parse(C context, Object form) throws Exception{ - return analyze(C.EXPRESSION, RT.second(form)); + return new MonitorExitExpr(analyze(C.EXPRESSION, RT.second(form))); } } @@ -1548,62 +1547,62 @@ static class TryExpr implements Expr{ } } -static class TryFinallyExpr implements Expr{ - final Expr tryExpr; - final Expr finallyExpr; - - - public TryFinallyExpr(Expr tryExpr, Expr finallyExpr){ - this.tryExpr = tryExpr; - this.finallyExpr = finallyExpr; - } - - public Object eval() throws Exception{ - throw new UnsupportedOperationException("Can't eval try"); - } - - public void emit(C context, FnExpr fn, GeneratorAdapter gen){ - Label startTry = gen.newLabel(); - Label endTry = gen.newLabel(); - Label end = gen.newLabel(); - Label finallyLabel = gen.newLabel(); - gen.visitTryCatchBlock(startTry, endTry, finallyLabel, null); - gen.mark(startTry); - tryExpr.emit(context, fn, gen); - gen.mark(endTry); - finallyExpr.emit(C.STATEMENT, fn, gen); - gen.goTo(end); - gen.mark(finallyLabel); - //exception should be on stack - finallyExpr.emit(C.STATEMENT, fn, gen); - gen.throwException(); - gen.mark(end); - } - - public boolean hasJavaClass() throws Exception{ - return tryExpr.hasJavaClass(); - } - - public Class getJavaClass() throws Exception{ - return tryExpr.getJavaClass(); - } - - static class Parser implements IParser{ - public Expr parse(C context, Object frm) throws Exception{ - ISeq form = (ISeq) frm; - //(try-finally try-expr finally-expr) - if(form.count() != 3) - throw new IllegalArgumentException( - "Wrong number of arguments, expecting: (try-finally try-expr finally-expr) "); - - if(context == C.EVAL || context == C.EXPRESSION) - return analyze(context, RT.list(RT.list(FN, PersistentVector.EMPTY, form))); - - return new TryFinallyExpr(analyze(context, RT.second(form)), - analyze(C.STATEMENT, RT.third(form))); - } - } -} +//static class TryFinallyExpr implements Expr{ +// final Expr tryExpr; +// final Expr finallyExpr; +// +// +// public TryFinallyExpr(Expr tryExpr, Expr finallyExpr){ +// this.tryExpr = tryExpr; +// this.finallyExpr = finallyExpr; +// } +// +// public Object eval() throws Exception{ +// throw new UnsupportedOperationException("Can't eval try"); +// } +// +// public void emit(C context, FnExpr fn, GeneratorAdapter gen){ +// Label startTry = gen.newLabel(); +// Label endTry = gen.newLabel(); +// Label end = gen.newLabel(); +// Label finallyLabel = gen.newLabel(); +// gen.visitTryCatchBlock(startTry, endTry, finallyLabel, null); +// gen.mark(startTry); +// tryExpr.emit(context, fn, gen); +// gen.mark(endTry); +// finallyExpr.emit(C.STATEMENT, fn, gen); +// gen.goTo(end); +// gen.mark(finallyLabel); +// //exception should be on stack +// finallyExpr.emit(C.STATEMENT, fn, gen); +// gen.throwException(); +// gen.mark(end); +// } +// +// public boolean hasJavaClass() throws Exception{ +// return tryExpr.hasJavaClass(); +// } +// +// public Class getJavaClass() throws Exception{ +// return tryExpr.getJavaClass(); +// } +// +// static class Parser implements IParser{ +// public Expr parse(C context, Object frm) throws Exception{ +// ISeq form = (ISeq) frm; +// //(try-finally try-expr finally-expr) +// if(form.count() != 3) +// throw new IllegalArgumentException( +// "Wrong number of arguments, expecting: (try-finally try-expr finally-expr) "); +// +// if(context == C.EVAL || context == C.EXPRESSION) +// return analyze(context, RT.list(RT.list(FN, PersistentVector.EMPTY, form))); +// +// return new TryFinallyExpr(analyze(context, RT.second(form)), +// analyze(C.STATEMENT, RT.third(form))); +// } +// } +//} static class ThrowExpr extends UntypedExpr{ final Expr excExpr; @@ -1791,112 +1790,112 @@ static class NewExpr implements Expr{ } -static class IdenticalExpr implements Expr{ - final Expr expr1; - final Expr expr2; - - - public IdenticalExpr(Expr expr1, Expr expr2){ - this.expr1 = expr1; - this.expr2 = expr2; - } - - public boolean hasJavaClass(){ - return true; - } - - public Class getJavaClass(){ - return Boolean.class; - } - - public Object eval() throws Exception{ - return expr1.eval() == expr2.eval() ? - RT.T : RT.F; - } - - public void emit(C context, FnExpr fn, GeneratorAdapter gen){ - if(context != C.STATEMENT) - { - Label not = gen.newLabel(); - Label end = gen.newLabel(); - expr1.emit(C.EXPRESSION, fn, gen); - expr2.emit(C.EXPRESSION, fn, gen); - gen.visitJumpInsn(IF_ACMPNE, not); - gen.getStatic(BOOLEAN_OBJECT_TYPE, "TRUE", BOOLEAN_OBJECT_TYPE); -// gen.getStatic(RT_TYPE, "T", KEYWORD_TYPE); - gen.goTo(end); - gen.mark(not); - gen.getStatic(BOOLEAN_OBJECT_TYPE, "FALSE", BOOLEAN_OBJECT_TYPE); -// NIL_EXPR.emit(C.EXPRESSION, fn, gen); - gen.mark(end); - } - } - - static class Parser implements IParser{ - public Expr parse(C context, Object frm) throws Exception{ - ISeq form = (ISeq) frm; - if(form.count() != 3) - throw new Exception("wrong number of arguments, expecting: (identical? x y)"); - - return new IdenticalExpr(analyze(C.EXPRESSION, RT.second(form)), analyze(C.EXPRESSION, RT.third(form))); - } - } -} - -static class InstanceExpr implements Expr{ - final Expr expr; - final Class c; - - - public InstanceExpr(Expr expr, Class c){ - this.expr = expr; - this.c = c; - } - - public Object eval() throws Exception{ - return c.isInstance(expr.eval()) ? - RT.T : RT.F; - } - - public boolean hasJavaClass(){ - return true; - } - - public Class getJavaClass(){ - return Boolean.class; - } - - public void emit(C context, FnExpr fn, GeneratorAdapter gen){ - if(context != C.STATEMENT) - { - Label not = gen.newLabel(); - Label end = gen.newLabel(); - expr.emit(C.EXPRESSION, fn, gen); - gen.instanceOf(Type.getType(c)); - gen.ifZCmp(GeneratorAdapter.EQ, not); - gen.getStatic(BOOLEAN_OBJECT_TYPE, "TRUE", BOOLEAN_OBJECT_TYPE); -// gen.getStatic(RT_TYPE, "T", KEYWORD_TYPE); - gen.goTo(end); - gen.mark(not); - gen.getStatic(BOOLEAN_OBJECT_TYPE, "FALSE", BOOLEAN_OBJECT_TYPE); -// NIL_EXPR.emit(C.EXPRESSION, fn, gen); - gen.mark(end); - } - } - - static class Parser implements IParser{ - public Expr parse(C context, Object frm) throws Exception{ - ISeq form = (ISeq) frm; - //(instance? x Classname) - if(form.count() != 3) - throw new Exception("wrong number of arguments, expecting: (instance? x Classname)"); - Class c = HostExpr.maybeClass(RT.third(form), true); - if(c == null) - throw new IllegalArgumentException("Unable to resolve classname: " + RT.third(form)); - return new InstanceExpr(analyze(C.EXPRESSION, RT.second(form)), c); - } - } -} +//static class IdenticalExpr implements Expr{ +// final Expr expr1; +// final Expr expr2; +// +// +// public IdenticalExpr(Expr expr1, Expr expr2){ +// this.expr1 = expr1; +// this.expr2 = expr2; +// } +// +// public boolean hasJavaClass(){ +// return true; +// } +// +// public Class getJavaClass(){ +// return Boolean.class; +// } +// +// public Object eval() throws Exception{ +// return expr1.eval() == expr2.eval() ? +// RT.T : RT.F; +// } +// +// public void emit(C context, FnExpr fn, GeneratorAdapter gen){ +// if(context != C.STATEMENT) +// { +// Label not = gen.newLabel(); +// Label end = gen.newLabel(); +// expr1.emit(C.EXPRESSION, fn, gen); +// expr2.emit(C.EXPRESSION, fn, gen); +// gen.visitJumpInsn(IF_ACMPNE, not); +// gen.getStatic(BOOLEAN_OBJECT_TYPE, "TRUE", BOOLEAN_OBJECT_TYPE); +//// gen.getStatic(RT_TYPE, "T", KEYWORD_TYPE); +// gen.goTo(end); +// gen.mark(not); +// gen.getStatic(BOOLEAN_OBJECT_TYPE, "FALSE", BOOLEAN_OBJECT_TYPE); +//// NIL_EXPR.emit(C.EXPRESSION, fn, gen); +// gen.mark(end); +// } +// } +// +// static class Parser implements IParser{ +// public Expr parse(C context, Object frm) throws Exception{ +// ISeq form = (ISeq) frm; +// if(form.count() != 3) +// throw new Exception("wrong number of arguments, expecting: (identical? x y)"); +// +// return new IdenticalExpr(analyze(C.EXPRESSION, RT.second(form)), analyze(C.EXPRESSION, RT.third(form))); +// } +// } +//} + +//static class InstanceExpr implements Expr{ +// final Expr expr; +// final Class c; +// +// +// public InstanceExpr(Expr expr, Class c){ +// this.expr = expr; +// this.c = c; +// } +// +// public Object eval() throws Exception{ +// return c.isInstance(expr.eval()) ? +// RT.T : RT.F; +// } +// +// public boolean hasJavaClass(){ +// return true; +// } +// +// public Class getJavaClass(){ +// return Boolean.class; +// } +// +// public void emit(C context, FnExpr fn, GeneratorAdapter gen){ +// if(context != C.STATEMENT) +// { +// Label not = gen.newLabel(); +// Label end = gen.newLabel(); +// expr.emit(C.EXPRESSION, fn, gen); +// gen.instanceOf(Type.getType(c)); +// gen.ifZCmp(GeneratorAdapter.EQ, not); +// gen.getStatic(BOOLEAN_OBJECT_TYPE, "TRUE", BOOLEAN_OBJECT_TYPE); +//// gen.getStatic(RT_TYPE, "T", KEYWORD_TYPE); +// gen.goTo(end); +// gen.mark(not); +// gen.getStatic(BOOLEAN_OBJECT_TYPE, "FALSE", BOOLEAN_OBJECT_TYPE); +//// NIL_EXPR.emit(C.EXPRESSION, fn, gen); +// gen.mark(end); +// } +// } +// +// static class Parser implements IParser{ +// public Expr parse(C context, Object frm) throws Exception{ +// ISeq form = (ISeq) frm; +// //(instance? x Classname) +// if(form.count() != 3) +// throw new Exception("wrong number of arguments, expecting: (instance? x Classname)"); +// Class c = HostExpr.maybeClass(RT.third(form), true); +// if(c == null) +// throw new IllegalArgumentException("Unable to resolve classname: " + RT.third(form)); +// return new InstanceExpr(analyze(C.EXPRESSION, RT.second(form)), c); +// } +// } +//} static class MetaExpr implements Expr{ final Expr expr; @@ -3152,7 +3151,7 @@ private static Expr analyzeSymbol(Symbol sym) throws Exception{ return new VarExpr(v, tag); } else if(o instanceof Class) - return new ClassExpr((Class) o); + return new QuoteExpr(o); throw new Exception("Unable to resolve symbol: " + sym + " in this context"); @@ -3169,9 +3168,13 @@ static Object resolve(Symbol sym) throws Exception{ 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"); + throw new IllegalAccessError("var: " + sym + " is not exported"); return v; } + else if(sym.name.indexOf('.') > 0 || sym.name.charAt(0) == '[') + { + return Class.forName(sym.name); + } else { Object o = currentNS().getMapping(sym); @@ -3182,7 +3185,7 @@ static Object resolve(Symbol sym) throws Exception{ } static Var lookupVar(Symbol sym, boolean internNew) throws Exception{ - Var var; + Var var = null; //note - ns-qualified vars must already exist if(sym.ns != null) @@ -3199,7 +3202,8 @@ static Var lookupVar(Symbol sym, boolean internNew) throws Exception{ if(o == null) { //introduce a new var in the current ns - var = currentNS().intern(Symbol.create(sym.name)); + if(internNew) + var = currentNS().intern(Symbol.create(sym.name)); } else if(o instanceof Var) { diff --git a/src/jvm/clojure/lang/Namespace.java b/src/jvm/clojure/lang/Namespace.java index fb59fba9..8893b9e9 100644 --- a/src/jvm/clojure/lang/Namespace.java +++ b/src/jvm/clojure/lang/Namespace.java @@ -30,7 +30,7 @@ public IPersistentMap getMappings(){ return mappings.get(); } -Var intern(Symbol sym){ +public Var intern(Symbol sym){ if(sym.ns != null) { throw new IllegalArgumentException("Can't intern namespace-qualified symbol"); diff --git a/src/jvm/clojure/lang/RT.java b/src/jvm/clojure/lang/RT.java index 6312eb57..aa09bd9e 100644 --- a/src/jvm/clojure/lang/RT.java +++ b/src/jvm/clojure/lang/RT.java @@ -113,7 +113,8 @@ 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 Symbol EQL_REF = Symbol.create("eql-ref?"); +//final static Symbol EQL_REF = Symbol.create("eql-ref?"); +static final Symbol IDENTICAL = Symbol.create("identical?"); //symbol final static Var CURRENT_NS = Var.intern(CLOJURE_NS, Symbol.create("*current-namespace*"), @@ -143,24 +144,24 @@ final static IFn inNamespace = new AFn(){ } }; //simple-symbol->var -final static Var 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, - new AFn(){ - public Object invoke(Object arg1) throws Exception{ - return Compiler.loadFile((String) arg1); - } - }), - EQL_REF, Var.intern(CLOJURE_NS, EQL_REF, - new AFn(){ - public Object invoke(Object arg1, Object arg2) - throws Exception{ - return arg1 == arg2 ? RT.T : RT.F; - } - }) - )); +//final static Var 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, +// new AFn(){ +// public Object invoke(Object arg1) throws Exception{ +// return Compiler.loadFile((String) arg1); +// } +// }), +// IDENTICAL, Var.intern(CLOJURE_NS, IDENTICAL, +// new AFn(){ +// public Object invoke(Object arg1, Object arg2) +// throws Exception{ +// return arg1 == arg2 ? RT.T : RT.F; +// } +// }) +// )); //static Var NS_IMPORTS = Var.intern(CLOJURE_NS,Symbol.create("*ns-imports*"), IMPORTS); //static Var NS_REFERS = Var.intern(CLOJURE_NS,Symbol.create("*ns-refers*"), REFERS); @@ -170,7 +171,20 @@ static AtomicInteger id = new AtomicInteger(1); static { - OUT.setTag(Symbol.create("java.io.OutputStreamWriter")); + Var.intern(CLOJURE_NS, IN_NAMESPACE, inNamespace); + Var.intern(CLOJURE_NS, LOAD_FILE, + new AFn(){ + public Object invoke(Object arg1) throws Exception{ + return Compiler.loadFile((String) arg1); + } + }); + Var.intern(CLOJURE_NS, IDENTICAL, + new AFn(){ + public Object invoke(Object arg1, Object arg2) + throws Exception{ + return arg1 == arg2 ? RT.T : RT.F; + } + }); try { InputStream ins = RT.class.getResourceAsStream("/boot.clj"); |