diff options
author | Rich Hickey <richhickey@gmail.com> | 2008-11-08 01:06:34 +0000 |
---|---|---|
committer | Rich Hickey <richhickey@gmail.com> | 2008-11-08 01:06:34 +0000 |
commit | 003b78dc22e84cf149eada4307c7c53cd79528af (patch) | |
tree | 0d810e6d751f1b5c45826ec83c3783aa6deb29a1 /src/jvm/clojure | |
parent | 67975cdedfa8a2f7780062cb67182aff32e7679e (diff) |
Interim checkin - DO NOT USE!!
Unless you are interested in helping test:
new print-dup functionality for replica generation of compilation constants
new *print-dup* flag, prints duplicators
back to simplified readably printing for repl
readable fns, as long as they are not closures
Diffstat (limited to 'src/jvm/clojure')
-rw-r--r-- | src/jvm/clojure/lang/Compiler.java | 9 | ||||
-rw-r--r-- | src/jvm/clojure/lang/PersistentArrayMap.java | 11 | ||||
-rw-r--r-- | src/jvm/clojure/lang/PersistentHashMap.java | 10 | ||||
-rw-r--r-- | src/jvm/clojure/lang/PersistentHashSet.java | 4 | ||||
-rw-r--r-- | src/jvm/clojure/lang/PersistentTreeMap.java | 10 | ||||
-rw-r--r-- | src/jvm/clojure/lang/PersistentTreeSet.java | 4 | ||||
-rw-r--r-- | src/jvm/clojure/lang/PersistentVector.java | 1 | ||||
-rw-r--r-- | src/jvm/clojure/lang/RT.java | 12 | ||||
-rw-r--r-- | src/jvm/clojure/lang/Var.java | 2 |
9 files changed, 55 insertions, 8 deletions
diff --git a/src/jvm/clojure/lang/Compiler.java b/src/jvm/clojure/lang/Compiler.java index 925cf639..4ee53cef 100644 --- a/src/jvm/clojure/lang/Compiler.java +++ b/src/jvm/clojure/lang/Compiler.java @@ -3042,10 +3042,15 @@ static public class FnExpr implements Expr{ // clinitgen.checkCast(DYNAMIC_CLASSLOADER_TYPE); // clinitgen.push(constantsID); // clinitgen.invokeVirtual(DYNAMIC_CLASSLOADER_TYPE, getConstantsMethod); + try{ + Var.pushThreadBindings(RT.map(RT.PRINT_DUP, RT.T)); for(int i = 0; i < constants.count(); i++) { String cs = RT.printString(constants.nth(i)); + if(cs.length() == 0) + throw new RuntimeException("Can't embed unreadable object in code: " + constants.nth(i)); + if(cs.startsWith("#<")) throw new RuntimeException("Can't embed unreadable object in code: " + cs); clinitgen.push(cs); @@ -3057,6 +3062,10 @@ static public class FnExpr implements Expr{ clinitgen.putStatic(fntype, constantName(i), constantType(i)); } } + finally{ + Var.popThreadBindings(); + } + } // for(ISeq s = RT.keys(keywords); s != null; s = s.rest()) // { // Keyword k = (Keyword) s.first(); diff --git a/src/jvm/clojure/lang/PersistentArrayMap.java b/src/jvm/clojure/lang/PersistentArrayMap.java index 969ec701..070fe1bf 100644 --- a/src/jvm/clojure/lang/PersistentArrayMap.java +++ b/src/jvm/clojure/lang/PersistentArrayMap.java @@ -11,6 +11,7 @@ package clojure.lang;
import java.util.Iterator;
+import java.util.Map;
/**
* Simple implementation of persistent map on an array
@@ -30,6 +31,16 @@ static final int HASHTABLE_THRESHOLD = 8; public static final PersistentArrayMap EMPTY = new PersistentArrayMap();
+static public IPersistentMap create(Map other){
+ IPersistentMap ret = EMPTY;
+ for(Object o : other.entrySet())
+ {
+ Map.Entry e = (Entry) o;
+ ret = ret.assoc(e.getKey(), e.getValue());
+ }
+ return ret;
+}
+
protected PersistentArrayMap(){
this.array = new Object[]{};
}
diff --git a/src/jvm/clojure/lang/PersistentHashMap.java b/src/jvm/clojure/lang/PersistentHashMap.java index 9d9e8a7b..173d1ecf 100644 --- a/src/jvm/clojure/lang/PersistentHashMap.java +++ b/src/jvm/clojure/lang/PersistentHashMap.java @@ -32,6 +32,16 @@ final INode root; final public static PersistentHashMap EMPTY = new PersistentHashMap(0, new EmptyNode()); +static public IPersistentMap create(Map other){ + IPersistentMap ret = EMPTY; + for(Object o : other.entrySet()) + { + Map.Entry e = (Entry) o; + ret = ret.assoc(e.getKey(), e.getValue()); + } + return ret; +} + /* * @param init {key1,val1,key2,val2,...} */ diff --git a/src/jvm/clojure/lang/PersistentHashSet.java b/src/jvm/clojure/lang/PersistentHashSet.java index 9f216010..c84929fe 100644 --- a/src/jvm/clojure/lang/PersistentHashSet.java +++ b/src/jvm/clojure/lang/PersistentHashSet.java @@ -14,6 +14,7 @@ package clojure.lang; import java.util.List; import java.util.Iterator; +import java.util.Collection; public class PersistentHashSet extends APersistentSet{ @@ -30,9 +31,8 @@ public static PersistentHashSet create(Object... init){ public static PersistentHashSet create(List init){ PersistentHashSet ret = EMPTY; - for(Iterator i = init.iterator(); i.hasNext();) + for(Object key : init) { - Object key = i.next(); ret = (PersistentHashSet) ret.cons(key); } return ret; diff --git a/src/jvm/clojure/lang/PersistentTreeMap.java b/src/jvm/clojure/lang/PersistentTreeMap.java index f1f960cf..51eeb01d 100644 --- a/src/jvm/clojure/lang/PersistentTreeMap.java +++ b/src/jvm/clojure/lang/PersistentTreeMap.java @@ -30,6 +30,16 @@ public final int _count; final static public PersistentTreeMap EMPTY = new PersistentTreeMap(); +static public IPersistentMap create(Map other){ + IPersistentMap ret = EMPTY; + for(Object o : other.entrySet()) + { + Map.Entry e = (Entry) o; + ret = ret.assoc(e.getKey(), e.getValue()); + } + return ret; +} + public PersistentTreeMap(){ this(RT.DEFAULT_COMPARATOR); } diff --git a/src/jvm/clojure/lang/PersistentTreeSet.java b/src/jvm/clojure/lang/PersistentTreeSet.java index 9055a05f..69bd6a63 100644 --- a/src/jvm/clojure/lang/PersistentTreeSet.java +++ b/src/jvm/clojure/lang/PersistentTreeSet.java @@ -15,6 +15,7 @@ package clojure.lang; import java.util.List; import java.util.Iterator; import java.util.Comparator; +import java.util.Collection; public class PersistentTreeSet extends APersistentSet implements Reversible, Sorted{ static public final PersistentTreeSet EMPTY = new PersistentTreeSet(null, PersistentTreeMap.EMPTY); @@ -30,9 +31,8 @@ public static PersistentTreeSet create(Object... init){ public static PersistentTreeSet create(List init){ PersistentTreeSet ret = EMPTY; - for(Iterator i = init.iterator(); i.hasNext();) + for(Object key : init) { - Object key = i.next(); ret = (PersistentTreeSet) ret.cons(key); } return ret; diff --git a/src/jvm/clojure/lang/PersistentVector.java b/src/jvm/clojure/lang/PersistentVector.java index f6158791..f94a0564 100644 --- a/src/jvm/clojure/lang/PersistentVector.java +++ b/src/jvm/clojure/lang/PersistentVector.java @@ -13,6 +13,7 @@ package clojure.lang; import java.util.List; +import java.util.Collection; public class PersistentVector extends APersistentVector{ final int cnt; diff --git a/src/jvm/clojure/lang/RT.java b/src/jvm/clojure/lang/RT.java index 2cb519cd..9ab615e5 100644 --- a/src/jvm/clojure/lang/RT.java +++ b/src/jvm/clojure/lang/RT.java @@ -200,13 +200,14 @@ final public static Var CURRENT_NS = Var.intern(CLOJURE_NS, Symbol.create("*ns*" final static Var FLUSH_ON_NEWLINE = Var.intern(CLOJURE_NS, Symbol.create("*flush-on-newline*"), T); final static Var PRINT_META = Var.intern(CLOJURE_NS, Symbol.create("*print-meta*"), F); final static Var PRINT_READABLY = Var.intern(CLOJURE_NS, Symbol.create("*print-readably*"), T); +final static Var PRINT_DUP = Var.intern(CLOJURE_NS, Symbol.create("*print-dup*"), F); final static Var WARN_ON_REFLECTION = Var.intern(CLOJURE_NS, Symbol.create("*warn-on-reflection*"), F); final static Var ALLOW_UNRESOLVED_VARS = Var.intern(CLOJURE_NS, Symbol.create("*allow-unresolved-vars*"), F); final static Var IN_NS_VAR = Var.intern(CLOJURE_NS, Symbol.create("in-ns"), F); final static Var NS_VAR = Var.intern(CLOJURE_NS, Symbol.create("ns"), F); static final Var PRINT_INITIALIZED = Var.intern(CLOJURE_NS, Symbol.create("print-initialized")); -static final Var PRINT_METHOD = Var.intern(CLOJURE_NS, Symbol.create("print-method")); +static final Var PR_ON = Var.intern(CLOJURE_NS, Symbol.create("pr-on")); //final static Var IMPORTS = Var.intern(CLOJURE_NS, Symbol.create("*imports*"), DEFAULT_IMPORTS); final static IFn inNamespace = new AFn(){ public Object invoke(Object arg1) throws Exception{ @@ -1191,8 +1192,8 @@ static public Object readString(String s){ static public void print(Object x, Writer w) throws Exception{ //call multimethod - if(PRINT_INITIALIZED.isBound()) - PRINT_METHOD.invoke(x, w); + if(PRINT_INITIALIZED.isBound() && RT.booleanCast(PRINT_INITIALIZED.get())) + PR_ON.invoke(x, w); //* else{ boolean readably = booleanCast(PRINT_READABLY.get()); @@ -1356,6 +1357,11 @@ static public void print(Object x, Writer w) throws Exception{ w.write(x.toString()); w.write('M'); } + else if(x instanceof Var) + { + Var v = (Var) x; + w.write("#=(var " + v.ns.name + "/" + v.sym + ")"); + } else w.write(x.toString()); } //*/ diff --git a/src/jvm/clojure/lang/Var.java b/src/jvm/clojure/lang/Var.java index a84ff663..fcbd746f 100644 --- a/src/jvm/clojure/lang/Var.java +++ b/src/jvm/clojure/lang/Var.java @@ -72,7 +72,7 @@ public static Var intern(Namespace ns, Symbol sym, Object root, boolean replaceR public String toString(){ if(ns != null) - return "#=(var " + ns.name + "/" + sym + ")"; + return "#'" + ns.name + "/" + sym; return "#<Var: " + (sym != null ? sym.toString() : "--unnamed--") + ">"; } |