Paul Mooser wrote:
> Good job tracking down that diff -- upon looking at it, unfortunately,
> I obviously don't understand the underlying issue being fixed (the
> inter-binding dependencies) because the "old code" basically matches
> what I would think would be the way to avoid introducing this in an
> outer let form
Lets macro-expand Christophe's example with both the old loop and the
new loop.
(loop [[x & xs] s
y xs]
...)
So with the old loop we get this:
(loop*
[G__13702 s
G__13703 xs]
(let [[x & xs] G__13702
y G__13703]
...))
See the problem? "xs" is used before it's defined.
The new loop uses the outer-let to get around this:
(let [G__13697 s
[x & xs] G__13697
y xs]
(loop* [G__13697 G__13697
y y]
(let [[x & xs] G__13697
y y]
...)))
What initially occurs to me is to move the outer loop into loop*'s vector:
(loop*
[G__13702 s
G__13703 (let [[x & xs] G__13702] xs)]
(let [[x & xs] G__13702
y G__13703]
x))
A problem with that is we're going to have to put in a destructuring let
of all the previous arguments for each loop* argument, so it'll blow up
in size pretty quickly and I guess the JVM won't optimize the unused
bindings away as it can't be sure the (first s) and (rest s) that [[x &
xs] s] expands into are side-effect free.
--~--~---------~--~----~------------~-------~--~----~
You received this message because you are subscribed to the Google
Groups "Clojure" group.
To post to this group, send email to [email protected]
Note that posts from new members are moderated - please be patient with your
first post.
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
-~----------~----~----~----~------~----~------~--~---