diff options
Diffstat (limited to 'src')
-rw-r--r-- | src/jvm/clojure/lang/BytecodeCompiler.java | 10 | ||||
-rw-r--r-- | src/jvm/clojure/lang/Var.java | 11 |
2 files changed, 20 insertions, 1 deletions
diff --git a/src/jvm/clojure/lang/BytecodeCompiler.java b/src/jvm/clojure/lang/BytecodeCompiler.java index 1fa463fd..5f4d39bb 100644 --- a/src/jvm/clojure/lang/BytecodeCompiler.java +++ b/src/jvm/clojure/lang/BytecodeCompiler.java @@ -1385,7 +1385,15 @@ private static Expr analyze(C context, Object form, String name) throws Exceptio private static Expr analyzeSeq(C context, ISeq form, String name) throws Exception{ Object op = RT.first(form); - //todo macro expansion + //macro expansion + if(op instanceof Symbol || op instanceof Var) + { + Var v = (op instanceof Var) ? (Var) op : lookupVar((Symbol) op, false); + if(v != null && v.isMacro()) + { + return analyze(context, v.applyTo(form.rest())); + } + } if(op.equals(DEF)) return DefExpr.parse(context, form); else if(op.equals(IF)) diff --git a/src/jvm/clojure/lang/Var.java b/src/jvm/clojure/lang/Var.java index 03477599..e4ca2e11 100644 --- a/src/jvm/clojure/lang/Var.java +++ b/src/jvm/clojure/lang/Var.java @@ -60,6 +60,7 @@ static InheritableThreadLocal<Frame> dvals = new InheritableThreadLocal<Frame>() Object root; transient final AtomicInteger count; final Symbol sym; +boolean macroFlag = false; static ConcurrentHashMap<Symbol, Var> table = new ConcurrentHashMap<Symbol, Var>(); @@ -148,6 +149,14 @@ public Object set(Object val){ throw new IllegalStateException(String.format("Can't change/establish root binding of: %s with set", sym)); } +public void setMacro(){ + macroFlag = true; +} + +public boolean isMacro(){ + return macroFlag; +} + public Object getRoot(){ return root; } @@ -156,8 +165,10 @@ final public boolean hasRoot(){ return root != dvals; } +//binding root always clears macro flag public void bindRoot(Object root){ this.root = root; + macroFlag = false; } public void unbindRoot(){ |