Yeah, I actually thought about this use case back when I wrote accum for wart. But there's no problem here since the two expansions also create lexical scopes. In unmodified anarki:
arc> (mac foo (accfn . body)
`(withs (acc@ nil ,accfn [push _ acc@])
,@body
(rev acc@)))
#(tagged mac #<procedure: foo>)
arc> (foo a
(each l '(1 2 3)
(a:foo b
(each m (list l (+ l 1) (+ l 2))
b.m))))
((1 2 3) (2 3 4) (3 4 5))
Is there some other scenario that I'm not considering?
(I hadn't realized that w/uniq is superior to implicit gensyms in this regard. Thanks.)
Okay, so the example with accum actually does work fine, but, only due to lexical scoping. I'm still afraid of the possibility of macros using the same symbols and causing a collision. While it looks like it would be an extremely rare bug to find, it would be one of those bugs that are a real pain to debug.
Agreed. Which is why we should pool resources and share the first time we encounter such a bug. Or even a possible such bug that we can then debug together.
For my part, I have had an eye out for it for three years and have yet to encounter such a bug. Here's my hand-wavy reasoning for why I think it can't happen: for it to happen, an outer macro would have to rely on a use of a specific gensym inside a nested macro. I can't imagine how that could happen short of actually trying to use a gensym:
(macro1
(macro1
..x23..)) ; brittlely relying on the gensym turning into *x23*
And if we are to worry about this we can worry about all gensyms anyway.