diff options
Diffstat (limited to 'src')
-rw-r--r-- | src/boot.clj | 41 | ||||
-rw-r--r-- | src/jvm/clojure/lang/RT.java | 80 |
2 files changed, 71 insertions, 50 deletions
diff --git a/src/boot.clj b/src/boot.clj index 1b6de1ee..f9e8f7d3 100644 --- a/src/boot.clj +++ b/src/boot.clj @@ -741,21 +741,30 @@ (rest fs)) fmap)))) -(defn print - ([x] (thisfn x *out*)) - ([x writer] (. clojure.lang.RT (print x writer)))) - -(defn newline - ([] (thisfn *out*)) - ([#^java.io.Writer writer] - (. writer (append \newline)) - nil)) - -(defn prn - ([x] (thisfn x *out*)) - ([x writer] - (print x writer) - (newline))) +(defn pr + ([x] + (. clojure.lang.RT (print x *out*)) + nil) + ([x & more] + (pr x) + (. *out* (append \space)) + (apply pr more))) + +(defn newline [] + (. *out* (append \newline)) + nil) + +(defn prn [& more] + (apply pr more) + (newline)) + +(defn print [& more] + (binding [*print-readably* nil] + (apply pr more))) + +(defn println [& more] + (binding [*print-readably* nil] + (apply prn more))) (defn read ([] @@ -983,7 +992,7 @@ eval import unimport refer unrefer in-namespace unintern into-array array make-proxy implement - prn print newline *out* *current-namespace* *print-meta* + pr prn print println newline *out* *current-namespace* *print-meta* *print-readably* doto memfn read *in* with-open time diff --git a/src/jvm/clojure/lang/RT.java b/src/jvm/clojure/lang/RT.java index e57429e6..48a6b71f 100644 --- a/src/jvm/clojure/lang/RT.java +++ b/src/jvm/clojure/lang/RT.java @@ -116,6 +116,7 @@ Symbol.create("Exception"), "java.lang.Exception" final static Var PRINT_META = Var.intern(Symbol.create("clojure", "*print-meta*"), null); +final static Var PRINT_READABLY = Var.intern(Symbol.create("clojure", "*print-readably*"), T); final static Var IMPORTS = Var.intern(Symbol.create("clojure", "*imports*"), DEFAULT_IMPORTS); final static IFn inNamespace = new AFn(){ @@ -677,10 +678,11 @@ static public boolean suppressRead(){ static public void print(Object x, Writer w) throws Exception{ //todo - make extensible + boolean readably = PRINT_READABLY.get() != null; if(x instanceof Obj) { Obj o = (Obj) x; - if(RT.count(o.meta()) > 0 && PRINT_META.get() != null) + if(RT.count(o.meta()) > 0 && readably && PRINT_META.get() != null) { IPersistentMap meta = o.meta(); w.write("#^"); @@ -702,30 +704,35 @@ static public void print(Object x, Writer w) throws Exception{ else if(x instanceof String) { String s = (String) x; - w.write('"'); - //w.write(x.toString()); - for(int i = 0; i < s.length(); i++) + if(!readably) + w.write(s); + else { - char c = s.charAt(i); - switch(c) + w.write('"'); + //w.write(x.toString()); + for(int i = 0; i < s.length(); i++) { - case'\n': - w.write("\\n"); - break; - case'\t': - w.write("\\t"); - break; - case'"': - w.write("\\\""); - break; - case'\\': - w.write("\\\\"); - break; - default: - w.write(c); + char c = s.charAt(i); + switch(c) + { + case'\n': + w.write("\\n"); + break; + case'\t': + w.write("\\t"); + break; + case'"': + w.write("\\\""); + break; + case'\\': + w.write("\\\\"); + break; + default: + w.write(c); + } } + w.write('"'); } - w.write('"'); } // else if(x instanceof ArgVector) // { @@ -771,21 +778,26 @@ static public void print(Object x, Writer w) throws Exception{ // } else if(x instanceof Character) { - w.write('\\'); char c = ((Character) x).charValue(); - switch(c) + if(!readably) + w.write(c); + else { - case'\n': - w.write("newline"); - break; - case'\t': - w.write("tab"); - break; - case' ': - w.write("space"); - break; - default: - w.write(c); + w.write('\\'); + switch(c) + { + case'\n': + w.write("newline"); + break; + case'\t': + w.write("tab"); + break; + case' ': + w.write("space"); + break; + default: + w.write(c); + } } } else w.write(x.toString()); |