diff options
author | Rich Hickey <richhickey@gmail.com> | 2007-09-04 13:32:49 +0000 |
---|---|---|
committer | Rich Hickey <richhickey@gmail.com> | 2007-09-04 13:32:49 +0000 |
commit | dfb7e514c4ab8a2c878b6deaa27d984f54b5d248 (patch) | |
tree | baab4fa1ba8476d73322437e170e5adcba837b49 /src | |
parent | c0b1333eb25fea97a04de528d5c8f612bd098e89 (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.java | 22 | ||||
-rw-r--r-- | src/jvm/clojure/lang/Var.java | 13 |
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(){ |