summaryrefslogtreecommitdiff
path: root/src
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
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')
-rw-r--r--src/clj/clojure/boot.clj26
-rw-r--r--src/jvm/clojure/lang/LispReader.java26
2 files changed, 50 insertions, 2 deletions
diff --git a/src/clj/clojure/boot.clj b/src/clj/clojure/boot.clj
index 79cd1891..7fd1a22c 100644
--- a/src/clj/clojure/boot.clj
+++ b/src/clj/clojure/boot.clj
@@ -3438,6 +3438,16 @@
(prefer-method print-method clojure.lang.IPersistentList clojure.lang.ISeq)
+(defmethod print-method java.util.List [o, #^Writer w]
+ (.write w "##(")
+ (.write w (.getName (class o)))
+ (.write w ". ")
+ (print-sequential "[" print-method " " "]" o w)
+ (.write w ")"))
+
+(prefer-method print-method clojure.lang.IPersistentList java.util.List)
+(prefer-method print-method clojure.lang.IPersistentVector java.util.List)
+
(def #^{:tag String
:doc "Returns escape string for char or nil if none"}
char-escape-string
@@ -3480,6 +3490,21 @@
"}"
(seq m) w))
+(defmethod print-method java.util.Map [m, #^Writer w]
+ (.write w "##(")
+ (.write w (.getName (class m)))
+ (.write w ". ")
+ (print-sequential
+ "{"
+ (fn [e #^Writer w]
+ (do (print-method (key e) w) (.append w \ ) (print-method (val e) w)))
+ ", "
+ "}"
+ (seq m) w)
+ (.write w ")"))
+
+(prefer-method print-method clojure.lang.IPersistentMap java.util.Map)
+
(defmethod print-method clojure.lang.IPersistentSet [s, #^Writer w]
(print-meta s w)
(print-sequential "#{" print-method " " "}" (seq s) w))
@@ -3503,6 +3528,7 @@
nil)
(defmethod print-method Class [#^Class c, #^Writer w]
+ (.write w "##")
(.write w (.getName c)))
(defmethod print-method java.math.BigDecimal [b, #^Writer w]
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;