diff options
author | Rich Hickey <richhickey@gmail.com> | 2008-03-24 13:54:39 +0000 |
---|---|---|
committer | Rich Hickey <richhickey@gmail.com> | 2008-03-24 13:54:39 +0000 |
commit | e5f0446e668b7593a41fbe7bc9d7bbc268a8a98b (patch) | |
tree | 3dbf1f37f320f964304dfc3e45b936e27fd2286d /src/jvm/clojure | |
parent | bb2105c6dd18f850b6d255d7959e7745f670ad90 (diff) |
made Repl load files in user ns, changed Repl to serve as better example of hosting Clojure in Java using public APIs
Diffstat (limited to 'src/jvm/clojure')
-rw-r--r-- | src/jvm/clojure/lang/Compiler.java | 2 | ||||
-rw-r--r-- | src/jvm/clojure/lang/Repl.java | 65 |
2 files changed, 35 insertions, 32 deletions
diff --git a/src/jvm/clojure/lang/Compiler.java b/src/jvm/clojure/lang/Compiler.java index efc1ce27..71c4fa28 100644 --- a/src/jvm/clojure/lang/Compiler.java +++ b/src/jvm/clojure/lang/Compiler.java @@ -164,7 +164,7 @@ static public Var VARS = Var.create(); static public Var METHOD = Var.create(null); //String -static public Var SOURCE = Var.create(null); +static public Var SOURCE = Var.create("NO_SOURCE_FILE"); //String static public Var SOURCE_PATH = Var.create(null); diff --git a/src/jvm/clojure/lang/Repl.java b/src/jvm/clojure/lang/Repl.java index 51b26304..37d1b654 100644 --- a/src/jvm/clojure/lang/Repl.java +++ b/src/jvm/clojure/lang/Repl.java @@ -16,44 +16,53 @@ import java.io.InputStreamReader; import java.io.OutputStreamWriter; public class Repl{ -static final Symbol REFER = Symbol.create("clojure", "refer"); -static final Symbol QUOTE = Symbol.create("quote"); +static final Symbol USER = Symbol.create("user"); static final Symbol CLOJURE = Symbol.create("clojure"); +static final Var in_ns = RT.var("clojure", "in-ns"); +static final Var refer = RT.var("clojure", "refer"); +static final Var ns = RT.var("clojure", "*ns*"); +static final Var warn_on_reflection = RT.var("clojure", "*warn-on-reflection*"); + public static void main(String[] args) throws Exception{ + //must call this once before using Clojure RT.init(); - for(String file : RT.processCommandLine(args)) - try - { - Compiler.loadFile(file); - } - catch(Exception e) - { - e.printStackTrace(); - } - //repl - LineNumberingPushbackReader rdr = new LineNumberingPushbackReader(new InputStreamReader(System.in)); - OutputStreamWriter w = (OutputStreamWriter) RT.OUT.get();//new OutputStreamWriter(System.out); - - Object EOF = new Object(); try { + //*ns* must be thread-bound for in-ns to work + //thread-bind *warn-on-reflection* so it can be set! + //must have corresponding popThreadBindings in finally clause Var.pushThreadBindings( - RT.map( - RT.CURRENT_NS, RT.CURRENT_NS.get(), - RT.WARN_ON_REFLECTION, RT.WARN_ON_REFLECTION.get(), - Compiler.SOURCE, "REPL" - )); + RT.map(ns, ns.get(), + warn_on_reflection, warn_on_reflection.get())); + + //create and move into the user namespace + in_ns.invoke(USER); + refer.invoke(CLOJURE); + + //load any supplied files + for(String file : RT.processCommandLine(args)) + try + { + Compiler.loadFile(file); + } + catch(Exception e) + { + e.printStackTrace(); + } + + //repl IO support + LineNumberingPushbackReader rdr = new LineNumberingPushbackReader(new InputStreamReader(System.in)); + OutputStreamWriter w = (OutputStreamWriter) RT.OUT.get();//new OutputStreamWriter(System.out); + Object EOF = new Object(); + + //start the loop w.write("Clojure\n"); - RT.inNamespace.invoke(Symbol.create("user")); - Compiler.eval(RT.list(REFER, RT.list(QUOTE, CLOJURE))); for(; ;) { try { - Var.pushThreadBindings( - RT.map(Compiler.LOADER, new DynamicClassLoader())); w.write(Compiler.currentNS().name + "=> "); w.flush(); Object r = LispReader.read(rdr, false, EOF, false); @@ -70,18 +79,12 @@ public static void main(String[] args) throws Exception{ } catch(Throwable e) { -// while(rdr.ready()) -// rdr.readLine(); Throwable c = e; while(c.getCause() != null) c = c.getCause(); System.err.println(c); e.printStackTrace(); } - finally - { - Var.popThreadBindings(); - } } } catch(Exception e) |