diff options
author | Rich Hickey <richhickey@gmail.com> | 2008-10-09 21:57:38 +0000 |
---|---|---|
committer | Rich Hickey <richhickey@gmail.com> | 2008-10-09 21:57:38 +0000 |
commit | 49022384daa01c2e0de497703a99627b748fd985 (patch) | |
tree | 3e61c9373aacc43f8d50f2dde2aae7afbf6b1678 /src | |
parent | c3c872bcfcc074fe1e56893214039e0de118ccc5 (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.clj | 26 | ||||
-rw-r--r-- | src/jvm/clojure/lang/LispReader.java | 26 |
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;
|