@Phlex & @MikeM, apologies I checked back on Chouser's post and it helped me
to understand that Clojure takes a different approach to macros than Common
Lisp:
Common Lisp
-----------------------------
(defmacro foobar ()
  `(+ a b))

(let
    ((a 5)
     (b 6))
  (foobar))

Clojure
-----------------------------
(defmacro foobar []
  `(+ ~'a ~'b))

(let
    [a 5
     b 6]
  (foobar))

The is answer to the WHY: Clojure believes its a good thing that it's harder
to shoot yourself in the foot than Common Lisp.  I agree.

Thanks

On Mon, Nov 3, 2008 at 2:35 PM, David Nolen <[EMAIL PROTECTED]> wrote:

> @Phlex, I understand why the code is usually bad form.
> @MikeM, I had already noticed that it worked on the REPL when I defined
> vars.  My questions was _why_ it does not work in the case where I have
> locals via a let expression?
>
> David
>
> On Mon, Nov 3, 2008 at 12:27 PM, MikeM <[EMAIL PROTECTED]>wrote:
>
>>
>>
>>
>> On Nov 3, 9:57 am, David Nolen <[EMAIL PROTECTED]> wrote:
>> > (defmacro foobar []
>> >   `'(+ a b))
>> >
>> > (let
>> >     [a 5
>> >      b 6]
>> >   (eval (foobar)))
>> >
>> > I know that the above is completely useless but I'm just trying to get
>> > an intuitive understanding of how macros work under Clojure.  At the
>> > REPL when I try to evaluate the second form, I get an null pointer
>> > exception.  Why can't the result of the foobar macro access the values
>> > of a and b?
>> >
>>
>> If you macroexpand,
>>
>> >(macroexpand '(foobar))
>>
>> you'll see that the a and b symbols in your macro are resolved to be
>> vars in the namespace in which the macro is defined (I defined the
>> macro in the user namespace):
>>
>> (quote (clojure/+ user/a user/b))
>>
>> Note that symbol + was resolved to be the + function from boot.clj,
>> since my user namespace refers to the clojure namespace.
>>
>> So when the foobar macro is run, the resulting code doesn't look at
>> the a and b in your let, but instead tries to find vars named a and b.
>> If you:
>>
>> > (def a 1)
>> > (def b 2)
>>
>> then execute
>>
>> > (let
>> >     [a 5
>> >      b 6]
>> >   (eval (foobar)))
>>
>> you'll get 3.
>>
>> Hope that helps.
>> >>
>>
>

--~--~---------~--~----~------------~-------~--~----~
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
-~----------~----~----~----~------~----~------~--~---

Reply via email to