diff options
author | Rich Hickey <richhickey@gmail.com> | 2010-01-14 19:27:54 -0500 |
---|---|---|
committer | Rich Hickey <richhickey@gmail.com> | 2010-01-14 19:27:54 -0500 |
commit | 277f0235c1387ddd6247a72857597814a3e10bc3 (patch) | |
tree | 960501148292f57c32fc4fd33e6f9e35d3ae1d40 /src/jvm/clojure | |
parent | e6a315bd3d514c6af10d2e7a853b693aa5f4520d (diff) |
add &form and &env implicit args to macros
Diffstat (limited to 'src/jvm/clojure')
-rw-r--r-- | src/jvm/clojure/lang/Compiler.java | 10 | ||||
-rw-r--r-- | src/jvm/clojure/lang/RT.java | 13 |
2 files changed, 11 insertions, 12 deletions
diff --git a/src/jvm/clojure/lang/Compiler.java b/src/jvm/clojure/lang/Compiler.java index 13bcf9de..9f58b794 100644 --- a/src/jvm/clojure/lang/Compiler.java +++ b/src/jvm/clojure/lang/Compiler.java @@ -5112,15 +5112,7 @@ public static Object macroexpand1(Object x) throws Exception{ Var v = isMacro(op); if(v != null) { - try - { - Var.pushThreadBindings(RT.map(RT.MACRO_META, RT.meta(form))); - return v.applyTo(form.next()); - } - finally - { - Var.popThreadBindings(); - } + return v.applyTo(RT.cons(form,RT.cons(LOCAL_ENV.get(),form.next()))); } else { diff --git a/src/jvm/clojure/lang/RT.java b/src/jvm/clojure/lang/RT.java index 277e62bc..2698c99f 100644 --- a/src/jvm/clojure/lang/RT.java +++ b/src/jvm/clojure/lang/RT.java @@ -180,7 +180,6 @@ final static Keyword TAG_KEY = Keyword.intern(null, "tag"); final static public Var AGENT = Var.intern(CLOJURE_NS, Symbol.create("*agent*"), null); final static public Var READEVAL = Var.intern(CLOJURE_NS, Symbol.create("*read-eval*"), T); final static public Var ASSERT = Var.intern(CLOJURE_NS, Symbol.create("*assert*"), T); -final static public Var MACRO_META = Var.intern(CLOJURE_NS, Symbol.create("*macro-meta*"), null); final static public Var MATH_CONTEXT = Var.intern(CLOJURE_NS, Symbol.create("*math-context*"), null); static Keyword LINE_KEY = Keyword.intern(null, "line"); static Keyword FILE_KEY = Keyword.intern(null, "file"); @@ -219,6 +218,15 @@ final static IFn inNamespace = new AFn(){ } }; +final static IFn bootNamespace = new AFn(){ + public Object invoke(Object __form, Object __env,Object arg1) throws Exception{ + Symbol nsname = (Symbol) arg1; + Namespace ns = Namespace.findOrCreate(nsname); + CURRENT_NS.set(ns); + return ns; + } +}; + public static List<String> processCommandLine(String[] args){ List<String> arglist = Arrays.asList(args); int split = arglist.indexOf("--"); @@ -264,8 +272,7 @@ static{ AGENT.setMeta(map(dockw, "The agent currently running an action on this thread, else nil")); AGENT.setTag(Symbol.create("clojure.lang.Agent")); MATH_CONTEXT.setTag(Symbol.create("java.math.MathContext")); - //during bootstrap ns same as in-ns - Var nv = Var.intern(CLOJURE_NS, NAMESPACE, inNamespace); + Var nv = Var.intern(CLOJURE_NS, NAMESPACE, bootNamespace); nv.setMacro(); Var v; v = Var.intern(CLOJURE_NS, IN_NAMESPACE, inNamespace); |