This would be just a wart in the Scheme language, destroying Scheme's
I agree that being unable to shadow a keyword would be a wart if keywords were really identifiers, but in Schemes that support them they are not. In Chicken or Guile, for example, you cannot write (let ((foo: 32) (+ 32 foo: 45)) => 109, and it would be really bad if you could, because what if instead of + you used some function with keywords instead? (Note: In Guile you must incant (set-reader! keywords suffix) to make this work.)
I am willing to say that RnRS was insufficiently forward-looking by not to allow space for identifier-like things that don't behave as identifiers, even if it doesn't define their exact behavior. #:foo is most certainly not an identifier, but only Chicken, Guile, Racket, and Kawa support it as keyword syntax, and in Chez it means "uninterned symbol" as in CL.
Both options are possible (so we have an Option 4) if positional and
keyword arguments do not have to be mixed.
I think allowing mixing is a great mistake. I don't know of any language, Lisp or not, that permits such a thing, even when the syntax makes clear when formal parameters appear in the call and when they don't. I am indifferent between Options 3 and 4, but prefer 2 to either.
John Cowan http://vrici.lojban.org/~cowan email@example.com
Original line from The Warrior's Apprentice by Lois McMaster Bujold:
"Only on Barrayar would pulling a loaded needler start a stampede toward one."
English-to-Russian-to-English mangling thereof: "Only on Barrayar you risk to
lose support instead of finding it when you threat with the charged weapon."