summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorRich Hickey <richhickey@gmail.com>2007-09-04 19:55:18 +0000
committerRich Hickey <richhickey@gmail.com>2007-09-04 19:55:18 +0000
commit8e5282d0366d1089998fbc13eb1cf275785edb7c (patch)
tree2ca9916874f35cff26ea5c76d968a6ab476a71b7 /src
parent55ed50c4975cf694828d46ee9ca32ce72a9ef913 (diff)
added macro support
Diffstat (limited to 'src')
-rw-r--r--src/jvm/clojure/lang/BytecodeCompiler.java10
-rw-r--r--src/jvm/clojure/lang/Var.java11
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(){