summaryrefslogtreecommitdiff
path: root/src/jvm/clojure
diff options
context:
space:
mode:
authorRich Hickey <richhickey@gmail.com>2010-01-14 19:27:54 -0500
committerRich Hickey <richhickey@gmail.com>2010-01-14 19:27:54 -0500
commit277f0235c1387ddd6247a72857597814a3e10bc3 (patch)
tree960501148292f57c32fc4fd33e6f9e35d3ae1d40 /src/jvm/clojure
parente6a315bd3d514c6af10d2e7a853b693aa5f4520d (diff)
add &form and &env implicit args to macros
Diffstat (limited to 'src/jvm/clojure')
-rw-r--r--src/jvm/clojure/lang/Compiler.java10
-rw-r--r--src/jvm/clojure/lang/RT.java13
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);