Re: Quick vote about portable keyword argument syntax Lassi Kortela 02 Nov 2019 23:28 UTC

>> Lambda is primitive syntax and deeply hardwired into most Schemes. We should not ask implementers to change it.
>
> For Scheme system, implementing SRFI 177 natively, it is trivial to
> amend "lambda" and "define" as exported by "(scheme base)". This has
> nothing to do what the primitive version of lambda is as the version
> exported by "(scheme base)" can be a macro expanding into the
> primitive version.

That could be done, but I'm not sure whether it's a wise decision.
Though 177 is designed with the principle of distilling what others have
already done and not inventing new semantics, we still don't have much
experience using it.

The semantics ought to be OK (they've been used for decades in Common
Lisp and in many Schemes). But the syntax (lambda/kw and call/kw) is
something we just invented. The Common Lisp lambda-list syntax as well
as SRFI 89 `lambda*` and `define*` have also been in use for a long
time, but they are quite complex and it's not clear that the complexity
justifies itself. I've used CL a lot and gradually came to view most
excesses of the lambda list syntax as probably design errors (similar to
the baroque syntax of the `loop` macro).

This is just a long-winded way to say that I'm not confident we have the
right lambda-list syntax, and therefore it's probably better not to put
it in `lambda`. Alternative operators like `lambda/kw`, `case-lambda`
etc. allow us to experiment without burdening ordinary `lambda` with any
design mistakes we make.

>> The same should apply for other extensions.   In particular, I think that as a matter of policy we should have keywords *or* optional arguments in any one procedure definition, not both.
>
> By "optional" arguments you mean rest arguments?

Probably optional positional arguments that are implemented by
destructuring the rest argument. The manual destructuring of optional
arguments could be wrapped into a convenient macro like `lambda/opt`.
Indeed, the SRFI 89 `lambda*` macro already supports it.

I agree that the combination of optional positional arguments and
keyword arguments is confusing.