OK. Perfect. Thanks. I was worried there for a moment. Next time I'll
read the docs more carefully. My fault.


On Jan 13, 3:29 am, Rich Hickey <richhic...@gmail.com> wrote:
> On Jan 12, 6:49 pm, Rock <rocco.ro...@gmail.com> wrote:
>
>
>
> > After a fair amount of macro writing in CL, I think I got the
> > backquote expansion mechanism pretty much nailed down (after all, it
> > is quite clear in the HyperSpec). Now, I thought I understood the
> > Clojure algorithm just as well. It looked very similar (concat instead
> > of append and so on). Apart from the namespace resolution business,
> > and a few other irrelevant details, the essence looked the same.
>
> > But I did the following just for fun, and I got a surprising result:
>
> > > (def x `a)
> > > (def a 5)
> > > `(list `(list ,,x))
>
> > What I theoretically was expecting was the outcome of this:
>
> > (concat (list `list) (list (concat (list `concat) (list (concat (list
> > `list) (list ``list))) (list (concat (list `list) (list x))))))
>
> > In other words, behind the curtains, the latter was supposed to be
> > evaluated. Now, as Guy Steele points out, with a k-level nested
> > backquote, you are guaranteed to get the same result only after k
> > evaluations. So evaluating twice the result is:
>
> > ((clojure.core/list 5))
>
> > I checked this in Common Lisp and the result was sure enough exactly
> > the equivalent, as I expected.
>
> > Yet, in clojure this is what happens (of course you see the first
> > evaluation directly in this case):
>
> > > `(list `(list ,,x))
>
> > (clojure.core/list (clojure.core/concat (clojure.core/list (quote
> > clojure.core/list)) (clojure.core/list (quote user/x))))
>
> > Another evaluation gives:
> > ((clojure.core/list user/x))
>
> > That's ALMOST the same but not quite. See the "user/x"? It came from a
> > very strange (quote user/x) above which wasn't supposed to be there. I
> > mean user/x should not have been quoted.
>
> > Is this a bug?
>
> The unquote character in Clojure is ~ not comma.
>
> user=> (eval `(list `(list ~~x)))
> ((clojure.core/list 5))
>
> Rich
--~--~---------~--~----~------------~-------~--~----~
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