On Mon, Nov 3, 2008 at 9:13 AM, Chanwoo Yoo <[EMAIL PROTECTED]> wrote: > > Below code is copied from 'On Lisp'. I just changed , to ~. But this > code does not work in Clojure. > > (defmacro abbrev [short long] > `(defmacro ~short [& args] > `(~'~long [EMAIL PROTECTED]))) > > Is there any important issue what I am overlooking when writing macros > in Clojure? Any help appreciated.
(defmacro abbrev [short long] `(defmacro ~short [& args#] `(~'~long [EMAIL PROTECTED]))) Your clue here is the error message: Can't use qualified name as parameter: user/args Clojure has a unique combination of features that help increase the hygine of macros. In your original translation, the word "args" was resolved into the "user" namespace because it was left bare. For local names (like formal arguments, "let" locals, etc.) you don't want that, so you need to use some mechanism to make it clear what you mean. One such mechanism is gensym (in this case I used the trailing # which is an auto-gensym). Another option is ~'foo which would explicitly capture "foo" from the context where the macro is expanded. --Chouser --~--~---------~--~----~------------~-------~--~----~ You received this message because you are subscribed to the Google Groups "Clojure" group. To post to this group, send email to clojure@googlegroups.com To unsubscribe from this group, send email to [EMAIL PROTECTED] For more options, visit this group at http://groups.google.com/group/clojure?hl=en -~----------~----~----~----~------~----~------~--~---