diff options
author | Rich Hickey <richhickey@gmail.com> | 2007-09-04 19:55:18 +0000 |
---|---|---|
committer | Rich Hickey <richhickey@gmail.com> | 2007-09-04 19:55:18 +0000 |
commit | 8e5282d0366d1089998fbc13eb1cf275785edb7c (patch) | |
tree | 2ca9916874f35cff26ea5c76d968a6ab476a71b7 | |
parent | 55ed50c4975cf694828d46ee9ca32ce72a9ef913 (diff) |
added macro support
-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(){ |