summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorRich Hickey <richhickey@gmail.com>2007-09-04 13:32:49 +0000
committerRich Hickey <richhickey@gmail.com>2007-09-04 13:32:49 +0000
commitdfb7e514c4ab8a2c878b6deaa27d984f54b5d248 (patch)
treebaab4fa1ba8476d73322437e170e5adcba837b49 /src
parentc0b1333eb25fea97a04de528d5c8f612bd098e89 (diff)
def with no init does not bind root, removed support for rebinding of Var via set
Diffstat (limited to 'src')
-rw-r--r--src/jvm/clojure/lang/BytecodeCompiler.java22
-rw-r--r--src/jvm/clojure/lang/Var.java13
2 files changed, 21 insertions, 14 deletions
diff --git a/src/jvm/clojure/lang/BytecodeCompiler.java b/src/jvm/clojure/lang/BytecodeCompiler.java
index 3412fbb8..600d5902 100644
--- a/src/jvm/clojure/lang/BytecodeCompiler.java
+++ b/src/jvm/clojure/lang/BytecodeCompiler.java
@@ -116,39 +116,45 @@ interface Expr{
static class DefExpr implements Expr{
final Var var;
final Expr init;
+ final boolean initProvided;
final static Method bindRootMethod = Method.getMethod("void bindRoot(Object)");
- public DefExpr(Var var, Expr init){
+ public DefExpr(Var var, Expr init, boolean initProvided){
this.var = var;
this.init = init;
+ this.initProvided = initProvided;
}
public Object eval() throws Exception{
- var.bindRoot(init.eval());
+ if(initProvided)
+ var.bindRoot(init.eval());
return var;
}
public void emit(C context, FnExpr fn, GeneratorAdapter gen){
fn.emitVar(gen, var);
- gen.dup();
- init.emit(C.EXPRESSION, fn, gen);
- gen.invokeVirtual(VAR_TYPE, bindRootMethod);
+ if(initProvided)
+ {
+ gen.dup();
+ init.emit(C.EXPRESSION, fn, gen);
+ gen.invokeVirtual(VAR_TYPE, bindRootMethod);
+ }
if(context == C.STATEMENT)
gen.pop();
}
public static Expr parse(C context, ISeq form) throws Exception{
//(def x) or (def x initexpr)
- if(form.count() > 3)
+ if(RT.count(form) > 3)
throw new Exception("Too many arguments to def");
- else if(form.count() < 2)
+ else if(RT.count(form) < 2)
throw new Exception("Too few arguments to def");
else if(!(RT.second(form) instanceof Symbol))
throw new Exception("Second argument to def must be a Symbol");
Var v = lookupVar((Symbol) RT.second(form), true);
if(!v.sym.ns.equals(currentNS()))
throw new Exception("Can't create defs outside of current ns");
- return new DefExpr(v, analyze(C.EXPRESSION, RT.third(form), v.sym.name));
+ return new DefExpr(v, analyze(C.EXPRESSION, RT.third(form), v.sym.name), RT.count(form) == 3);
}
}
diff --git a/src/jvm/clojure/lang/Var.java b/src/jvm/clojure/lang/Var.java
index 267bc7ee..b55f8afc 100644
--- a/src/jvm/clojure/lang/Var.java
+++ b/src/jvm/clojure/lang/Var.java
@@ -124,12 +124,13 @@ public Object set(Object val){
Box b = getThreadBinding();
if(b != null)
return (b.val = val);
- if(hasRoot())
- {
- bindRoot(val);
- return val;
- }
- throw new IllegalStateException(String.format("Can't establish root binding of: %s with set", sym));
+ //jury still out on this
+// if(hasRoot())
+// {
+// bindRoot(val);
+// return val;
+// }
+ throw new IllegalStateException(String.format("Can't change/establish root binding of: %s with set", sym));
}
public Object getRoot(){