I definitely don't want to bring the identifier into the run-time, but
I don't think that it is needed. Whenever a hygienic keyword is
created (that is where `test:' is bound), an internal counter value
could be recorded with the binding.
would then become something like `(12345678 #<procedure eqv?>)' where
`12345678' is a unique number or unique location in the store (think
of the generative records of R7RS). Keyword argument lists could then
also be modeled through hash tables instead of alists.
That seems workable.
Actually, in Gauche, a keyword (noted like ':foo') is just a symbol. However, it is automatically bound
to itself in a library (gauche keyword), so if you import that library, you can say (f :foo x) which is effectively
the same as (f ':foo x).
But you can also make a library that exports :foo to a unique value in the library. Hygiene applies to
resolve bindings so you can use both :foo without conflict:
(import (rename (gauche keyword) (:foo g:foo))
(my library that exports :foo))
(f :foo x g:foo y)
Note that we still deal with runtime value to match keyword arguments; so your performance concern
is still there, but is'nt hygiene concern addressed with this?