views:

89

answers:

1

not sure how to express this..

I've written a macro which takes two arguments. The first one essentially contains identifiers for generating a let expression. The second is the code to use inside the let expression (it wants to have access to these identifiers).

An example:

(match (Add {ast-> x}) (println x))

When the second argument is raw code, things work nicely. x binds to the x defined in the let expression (when macroexpanded it just shows as x). However, when the second argument is a macro which generates (println x), x expands to something like user/x.

Any good ideas on how to fix this?

+1  A: 

It sounds like your second macro is defined as:

(defmacro foo
  []
  `(println x))

This is incorrect as x will be namespace qualified. The correct version of the second macro in this case would be:

(defmacro foo
  []
  `(println ~'x))

Now the x in the println call will be a literal x symbol and not namespace qualified.

Brian
Ah, exactly what I wanted, thanks!
Ellery Newcomer