summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorRich Hickey <richhickey@gmail.com>2007-12-31 22:46:20 +0000
committerRich Hickey <richhickey@gmail.com>2007-12-31 22:46:20 +0000
commit3fc47bccfdabc5d764b15a0c4b1f5d4bd5fa27ac (patch)
treeace09fcb4712a69825da749410b000883210654a
parenta7ff6709d9319128d200bfdac8955cad1659e051 (diff)
added *print-readably* support to pr, prn, print and println
-rw-r--r--src/boot.clj41
-rw-r--r--src/jvm/clojure/lang/RT.java80
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());