Read syntax for hygienic keywords Lassi Kortela (20 Oct 2019 10:34 UTC)
Re: Read syntax for hygienic keywords Shiro Kawai (20 Oct 2019 12:32 UTC)
Re: Read syntax for hygienic keywords Marc Nieper-Wißkirchen (20 Oct 2019 21:23 UTC)
Re: Read syntax for hygienic keywords Lassi Kortela (21 Oct 2019 08:27 UTC)
Re: Read syntax for hygienic keywords Per Bothner (21 Oct 2019 23:27 UTC)

Re: Read syntax for hygienic keywords Lassi Kortela 21 Oct 2019 08:27 UTC

> (foo a b #:key1 c #:key2 d)
>
> could be equivalent to:
>
> (foo a b (symbol->keyword 'key1) c (symbol->keyword 'key2) d)
>
> if keyword objects in argument positions are not recognized as
> ordinary values but as markers.
>
> On the other, if `key1' and `key2' are bound as identifiers (!) to
> keywords (in the sense of some version of SRFI 177), the following
>
> (foo a b key1 c key2 d)
>
> can still mean that `c' and `d' are extra keyword arguments because
> they expander would inspect the bindings of `key1' and `key2' first.
>
> Of course, this will only work if calling procedures with keyword
> arguments is recognized at expand time vs. run-time. For anonymous
> procedures with keyword arguments, we would therefore have to use a
> construct like `keyword-call'.

This would work well for CL-style keyword arguments, but would it work
for Kawa/Racket-style keywords-as-markers? As far as I can tell, those
currently rely on the fact that the markers are read in as keywords,
i.e. their bindings don't need to be looked up at all. Wouldn't the (foo
a b key1 c key2 d) solution require the compiler to look up the bindings
of key1 and key2 before deciding that they indicate keyword arguments?
If the same identifiers are imported with non-keyword bindings, that
would change the interpretation of the whole argument list. (In
fairness, CL-style keyword calls are also liable to have their whole
interpretation changed in that scenario.)

If I understood correctly, the main advantage of Kawa/Racket keyword
markers is that the compiler knows their interpretation cannot change
based on bindings and evaluation, so it has more freedom to check and
optimize things more easily.

In case Per is lurking, could you explain this to us please? :)