[racket] Again on bindings visibility in eval
On Thu, Jul 14, 2011 at 4:35 AM, Thomas Chust <chust at web.de> wrote:
> While Clojure *mitigates* the problems of non-hygienic macros using
> namespaces and a shorthand syntax for freshly generated identifiers, it
> doesn't *solve* the problems. Racket's macro system, on the other hand,
> does solve the problems and since that involves some heavy lifting, it
> may seem more complicated at first glance.
I would like to better understand how Clojure's mitigation strategy is
insufficient. Since Eli's document is all about the while macro,
let's look at Clojure's while macro.
(defmacro while [test & body]
`(loop []
(when ~test
~@body
(recur))))
What is broken about this? I tried breaking it in a way comparable to
what Eli did in his document, e.g., binding every keyword/variable in
the macro to something non-sensical, but it didn't break. Here's the
comparable Clojure code to what Eli did:
(def x (atom 2))
(let [loop 5 when 2 test 4 body 3 recur 4]
(while (< @x 10)
(println @x)
(reset! x (inc @x))))
Thanks.
--Mark
P.S. I'm enjoying this discussion. I feel like I'm finally getting a
handle on what kind of how "syntax" is represented and manipulated in
Racket. It still seems like an awful lot of work, though, so I would
like to see more examples of why it is worth the effort.