Using gensym properly

What do you mean by that?

That’s what all versions above means. Your version included.

If you want a compile time generated (non-threadsafe and non-reentrant) array that are shared through multiple runtime execution of the same macro expansion, you can splice in the array directly (i.e. do arr = [] in the macro and splice in this value and not the name). If you want some function local sharing then no it’s impossible and you shouldn’t do it. Any state that’s not local for a single macro should be explicitly managed.