On Thu, May 28, 2009 at 5:42 PM, Meikel Brandmeyer <m...@kotka.de> wrote:
> Am 28.05.2009 um 23:29 schrieb CuppoJava:
>
>> In my recent macro-writing adventure, I discovered that
>> (gensym) is not actually equivalent to using #.  Can
>> someone explain to me how # actually works in backquoted
>> form?
>
> The foo# form will replace the foo symbol statically in the
> syntax-quote form. So when you call deftemp the second
> time, you basically reassign the same Var you assigned
> to before.
>
> With gensym you always create a new symbols. Hence
> there is no conflict.

That's a fascinating point, and I hadn't considered it
before.  It's subtle enough it might be worth go over again.

Here are two functions the do roughly the same thing --
return a list with a single gensym'ed symbol in it:

(defn f-auto []
  `(foo#))

(defn f-gen []
  (let [foo (gensym "foo_")]
    `(~foo)))

But when called multiple times, you can clearly see the
difference, where f-auto's auto-gensym produces the same
symbol every time:

user=> (f-gen)
(foo_442)
user=> (f-gen)
(foo_446)
user=> (f-gen)
(foo_450)

user=> (f-auto)
(foo__425__auto__)
user=> (f-auto)
(foo__425__auto__)
user=> (f-auto)
(foo__425__auto__)

Thanks for bringing this up.
--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 
clojure+unsubscr...@googlegroups.com
For more options, visit this group at 
http://groups.google.com/group/clojure?hl=en
-~----------~----~----~----~------~----~------~--~---

Reply via email to