summaryrefslogtreecommitdiff
path: root/src/jvm/clojure
diff options
context:
space:
mode:
authorRich Hickey <richhickey@gmail.com>2008-11-08 01:06:34 +0000
committerRich Hickey <richhickey@gmail.com>2008-11-08 01:06:34 +0000
commit003b78dc22e84cf149eada4307c7c53cd79528af (patch)
tree0d810e6d751f1b5c45826ec83c3783aa6deb29a1 /src/jvm/clojure
parent67975cdedfa8a2f7780062cb67182aff32e7679e (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.java9
-rw-r--r--src/jvm/clojure/lang/PersistentArrayMap.java11
-rw-r--r--src/jvm/clojure/lang/PersistentHashMap.java10
-rw-r--r--src/jvm/clojure/lang/PersistentHashSet.java4
-rw-r--r--src/jvm/clojure/lang/PersistentTreeMap.java10
-rw-r--r--src/jvm/clojure/lang/PersistentTreeSet.java4
-rw-r--r--src/jvm/clojure/lang/PersistentVector.java1
-rw-r--r--src/jvm/clojure/lang/RT.java12
-rw-r--r--src/jvm/clojure/lang/Var.java2
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--") + ">";
}