Just quickly tried in Gauche

https://gist.github.com/shirok/f824b798dc1326314e51c5fb2dfdc3d5

This one depends on the Gauche-specific "compiler-macro" feature (available in HEAD). 
I think identifier-syntax approach is basically similar.

In Gauche, hygienic keyword comparison at compile-time and the value-comparison at run-time fallback match by default, since Gauche exports all keywords from gauche.keyword module, each constantly bound to itself.  So as far as the call site also uses gauche.keyword, it works (which is implicitly done in Gauche programs, but needs to be explicit in R7RS programs).

I'm thinking the implications if we allow keywords imported from different sources---the hygienic comparison works, but we have to keep correspondence of identifiers and some run-time values that should be unique to each identifier.