summaryrefslogtreecommitdiff
path: root/src/jvm/clojure
diff options
context:
space:
mode:
authorRich Hickey <richhickey@gmail.com>2008-10-09 21:57:38 +0000
committerRich Hickey <richhickey@gmail.com>2008-10-09 21:57:38 +0000
commit49022384daa01c2e0de497703a99627b748fd985 (patch)
tree3e61c9373aacc43f8d50f2dde2aae7afbf6b1678 /src/jvm/clojure
parentc3c872bcfcc074fe1e56893214039e0de118ccc5 (diff)
added ##expr reader support, reads read-time evaluated value of expr
added print support for java.util.Map/List print classes readably with ##
Diffstat (limited to 'src/jvm/clojure')
-rw-r--r--src/jvm/clojure/lang/LispReader.java26
1 files changed, 24 insertions, 2 deletions
diff --git a/src/jvm/clojure/lang/LispReader.java b/src/jvm/clojure/lang/LispReader.java
index e3ef9fc2..dc8be578 100644
--- a/src/jvm/clojure/lang/LispReader.java
+++ b/src/jvm/clojure/lang/LispReader.java
@@ -82,10 +82,11 @@ static
dispatchMacros['^'] = new MetaReader();
- dispatchMacros['\''] = new WrappingReader(THE_VAR);
+ dispatchMacros['\''] = new VarReader();
dispatchMacros['"'] = new RegexReader();
dispatchMacros['('] = new FnReader();
dispatchMacros['{'] = new SetReader();
+ dispatchMacros['#'] = new EvalReader();
}
static boolean isWhitespace(int ch){
@@ -171,7 +172,7 @@ static public Object read(PushbackReader r, boolean eofIsError, Object eofValue,
throw e;
LineNumberingPushbackReader rdr = (LineNumberingPushbackReader) r;
//throw new Exception(String.format("ReaderError:(%d,1) %s", rdr.getLineNumber(), e.getMessage()), e);
- throw new ReaderException(rdr.getLineNumber(),e);
+ throw new ReaderException(rdr.getLineNumber(), e);
}
}
@@ -454,6 +455,17 @@ static class WrappingReader extends AFn{
}
+static class VarReader extends AFn{
+ public Object invoke(Object reader, Object quote) throws Exception{
+ PushbackReader r = (PushbackReader) reader;
+ Object o = read(r, true, null, true);
+ Object v = Compiler.maybeResolveIn(Compiler.currentNS(), (Symbol) o);
+ if(v instanceof Var)
+ return v;
+ return RT.list(THE_VAR, o);
+ }
+}
+
/*
static class DerefReader extends AFn{
@@ -804,6 +816,16 @@ static class ListReader extends AFn{
}
+static class EvalReader extends AFn{
+ public Object invoke(Object reader, Object eq) throws Exception{
+ PushbackReader r = (PushbackReader) reader;
+
+ Compiler.Expr expr = Compiler.analyze(Compiler.C.EVAL, read(r, true, null, true));
+ return expr.eval();
+ }
+
+}
+
//static class ArgVectorReader extends AFn{
// public Object invoke(Object reader, Object leftparen) throws Exception{
// PushbackReader r = (PushbackReader) reader;