Re: Keyword arguments in R7RS-large and SRFIs Amirouche Boubekki 03 Nov 2019 14:27 UTC

Le dim. 3 nov. 2019 à 10:16, Lassi Kortela <xxxxxx@lassi.io> a écrit :
>
> > SRFI 177 has been advertised that it offers a portable way to extend
> > an API while retaining compatibility.
> >
> > This is different to designing an API from scratch using keyword arguments.
> >
> > I strongly suggest not to do this for any API that is for inclusion
> > into R7RS-large.
>
> I'll leave the R7RS-large decision to others.
>
> But a related concern is that some SRFI authors may want to use keyword
> arguments. If you want to include some functionality in R7RS-large and
> the SRFI about that topic happens to use keyword args, how will the
> issue be resolved - change the API from the SRFI or design a new API?
>
> We could have an informal agreement not to use keyword args in SRFIs
> that might go into R7RS-large. My personal opinion is that that would be
> a bad call, because for many complex tasks, all the alternatives to
> keyword args are a poor emulation of them:
>
> * optional positional arguments (same as kwargs with no names)
> * alist or plist argument (like kwargs with no static checking or
> optimization)
> * record type (like kwargs, but need to define a new record type just
> for one procedure)
>
> SRFI 167 (just being finalized) has good examples:
>
> (make-engine open close in-transaction ref set delete range-remove range
> prefix-range hook-on-transaction-begin hook-on-transaction-commit pack
> unpack)

This is a write-once use-many expression, so it is not a good
candidate for keywords.

>
> (engine-in-transaction engine okvs proc [failure [success [make-state
> [config]]]])
>
> (engine-range engine okvs start-key start-include? end-key end-include?
> [config])

In those, only config is really a candidate to keyword arguments the
others have well-known default values:

  failure -> raise
  success -> values
  make-state -> make-default-state

That is it is easy to customize.

> IMHO all of these would be easier to understand (and to make
> implementation-defined extensions) with keyword args.

--
Amirouche ~ https://hyper.dev