summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--src/boot.clj14
-rw-r--r--src/jvm/clojure/lang/Compiler.java19
2 files changed, 27 insertions, 6 deletions
diff --git a/src/boot.clj b/src/boot.clj
index 0aed40cd..8fe4ae57 100644
--- a/src/boot.clj
+++ b/src/boot.clj
@@ -839,6 +839,19 @@
(encl-fn (map rest collseq))))))
(cons coll colls)))))
+(defn macroexpand-1 [form]
+ (let [v (. clojure.lang.Compiler (isMacro (first form)))]
+ (if v
+ (apply @v (rest form))
+ form)))
+
+(defn macroexpand [form]
+ (let [ex (macroexpand-1 form)
+ v (. clojure.lang.Compiler (isMacro (first ex)))]
+ (if v
+ (macroexpand ex)
+ ex)))
+
(def *exports*
'(clojure
load-file eql-ref?
@@ -879,5 +892,6 @@
int long float double short byte boolean char
aget aset aset-boolean aset-int aset-long aset-float aset-double aset-short aset-byte
make-array
+ macroexpand-1 macroexpand
))
diff --git a/src/jvm/clojure/lang/Compiler.java b/src/jvm/clojure/lang/Compiler.java
index e3cf7354..f15795b2 100644
--- a/src/jvm/clojure/lang/Compiler.java
+++ b/src/jvm/clojure/lang/Compiler.java
@@ -2786,6 +2786,16 @@ static public class CompilerException extends Exception{
}
}
+static public Var isMacro(Object op) throws Exception{
+ if(op instanceof Symbol || op instanceof Var)
+ {
+ Var v = (op instanceof Var) ? (Var) op : lookupVar((Symbol) op, false);
+ if(v != null && v.isMacro())
+ return v;
+ }
+ return null;
+}
+
private static Expr analyzeSeq(C context, ISeq form, String name) throws Exception{
Integer line = (Integer) LINE.get();
try
@@ -2796,13 +2806,10 @@ private static Expr analyzeSeq(C context, ISeq form, String name) throws Excepti
RT.map(LINE, line));
Object op = RT.first(form);
//macro expansion
- if(op instanceof Symbol || op instanceof Var)
+ Var v = isMacro(op);
+ if(v != null)
{
- Var v = (op instanceof Var) ? (Var) op : lookupVar((Symbol) op, false);
- if(v != null && v.isMacro())
- {
- return analyze(context, v.applyTo(form.rest()));
- }
+ return analyze(context, v.applyTo(form.rest()));
}
IParser p;
if(op.equals(FN))