However, there is a very simple change that can be made to the Arc compiler which would make hygienic macros easy to write.
The Arc compiler would have a big hash table which maps from global symbols to gensyms.
Whenever you define a global variable, it will create a new gensym and store it in the hash table.
When using the quasiquote syntax, it will lookup the variable in the hash table and will use the gensym rather than the symbol.
As an example, if you have this Arc program:
(= foo 1) (mac bar () `(+ foo 2))
(= #<foo:1> 1) (mac #<bar:1> () `(#<+:1> #<foo:1> 2))
Now the macro bar will always expand to the correct global variable foo, and therefore it is 100% hygienic.
If you want to intentionally break hygiene, you can simply do this:
(mac bar () `(+ ,'foo 2))
This change is very easy to make in the Arc compiler, and it only requires a few minor changes to the language.