summaryrefslogtreecommitdiff
path: root/src/jvm/clojure
diff options
context:
space:
mode:
authorRich Hickey <richhickey@gmail.com>2008-03-24 13:54:39 +0000
committerRich Hickey <richhickey@gmail.com>2008-03-24 13:54:39 +0000
commite5f0446e668b7593a41fbe7bc9d7bbc268a8a98b (patch)
tree3dbf1f37f320f964304dfc3e45b936e27fd2286d /src/jvm/clojure
parentbb2105c6dd18f850b6d255d7959e7745f670ad90 (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.java2
-rw-r--r--src/jvm/clojure/lang/Repl.java65
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)