diff options
Diffstat (limited to 'src')
-rw-r--r-- | src/boot.clj | 14 | ||||
-rw-r--r-- | src/jvm/clojure/lang/Compiler.java | 19 |
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)) |