Re: Quick vote about portable keyword argument syntax Lassi Kortela 01 Nov 2019 21:06 UTC

>> (keyword-call foo 1 2 (e 5 c 3 d 4))
>
> I don't like this syntax - it awkwardly separates the keyword
> arguments from positional arguments.  Better would be:
>
> (keyword-call foo 1 2 (e 5) (c 3) (d 4))
>
> I realize this may be more difficult, and might have some
> problems with ambiguity.

That's the reason it was done that way. The initial goal was to have a
portable fallback implementation using a syntax-rules macro. The popular
tail-patterns extension can match anything of the form:

(foo ... (an inner list as the last element of the outer list))

The syntax (keyword-call foo ... (keys ...)) takes advantage of that.

Using syntax-rules with tail-patterns would also support:

(keyword-call foo 1 2 ((e 5) (c 3) (d 4)))

But one could argue that's the worst of both worlds :p

>> And who would prefer option 2 where all of these are supported:
>>
>> (keyword-lambda (a b :key c d e) <lambda body ...>)
>>
>> (keyword-call foo 1 2 e: 5 c: 3 d: 4)     ; In all Schemes
>> (keyword-call foo 1 2 :e 5 :c 3 :d 4)     ; In all Schemes
>> (keyword-call foo 1 2 #:e 5 #:c 3 #:d 4)  ; In Schemes that have #:

> Partly because this is closer to Kawa, it would be my preference.

I'm also leaning toward option 2, and John already suggested in another
thread to drop the requirement to be implenentable using syntax-rules.
I'll be happy to submit a new draft of the SRFI using this syntax is
nobody is opposed to it.

It's extra-nice that this is the same syntax that several Schemes are
already using for keyword calls, only with keyword-call (or call/kw)
prepended to the front. So it's easy to convert code back and forth.