This is what you get for insisting that names are the same as the
thing they name.
I have done nothing of the sort.
#:G622 is not interned, so another occurrence of #:G622 is a
completely different symbol that has the same name.
That has an equally useless consequence: if the macro generates an
assignment of an argument's evaluation to #:G622, followed by a
function call using #:G622 as a parameter, the function call won't
receive the result of the argument's evaluation because its parameter
was a different #:G622.
The only way around it is to maintain some kind of pointer to the
first #:G622, but then you need someplace to store that pointer and a
name for THAT. It's an infinite regress that cannot solve the problem
posed.
If you create a variable with the name #:G622 in the
calling scope, that will be an entirely different variable than the
one in the macro, so there's no problem.
There's a different problem, rather than no problem. The macro output
itself won't be able to refer to the same #:G622 twice. Except by
using some non-#

repended name to refer, directly or indirectly, to
it, and then that name becomes the potential source of a collision.
Of course it isn't. Macros can alter variables (for state in the
current image) and read and write files (for state that outlasts the
image), just like any other function.
It was impossible within the constraints of solving the posed problem,
which included "no global variables".
Furthermore, macros cannot alter variables at run-time, and if they
can alter files on disk, this seems useless and dangerous. Perhaps you
meant the code that is output by the macro evaluation, and which later
is compiled and run as part of the program, rather than the macro's
own body? The code generated by the macro can obviously alter run-time
state and disk files, but for the macro's various expansion-instances
to maintain shared, persistent state in this manner would violate the
no-global-variables constraint.
Except that, you know, you can't get the name of that variable.
See above. If that were completely true, the variable would be
useless, since you could not both store into it and then subsequently
retrieve from it. So there must be a way to refer to it repeatedly,
but whatever that mechanism is, it will recreate the original problem
of variable capture, since the context of the macro invocation, or one
of the macro's own arguments, could contain, by chance, a construct
that likewise refers to it.
Put more simply, if the macro's expansion can only refer to something
once, then it cannot be useful for avoiding multiple evaluation. If,
on the other hand, the macro's expansion can refer to a thing
repeatedly, there must be some particular piece of code that, within
some lexical scope, has the effect of referring to that same thing at
each place in that scope where that piece of code occurs. It follows
that that same piece of code, appearing elsewhere in the call site's
context, can end up having that same effect there, outside of the
macro's expansion, and then capture has occurred. Furthermore,
although the macro can compute that piece of code in some more complex
way than by its being a fixed, literal string in the source code, it
can only compute functions of its arguments, and therefore cannot
determine a "safe" such piece of code in full generality since it
cannot know of usages outside the macro invocation's arguments but
inside the immediately-enclosing scope.