Re: Is recieve macro from base implementation of SRFI-1 in fact SRFI-8? Daphne Preston-Kendal 24 Aug 2021 08:37 UTC

On 24 Aug 2021, at 09:50, Marc Nieper-Wißkirchen <xxxxxx@gmail.com> wrote:

> Thanks for sharing this.  As for the name:  After having rethought it, the name "opt-lambda" (or a similar one) is the better name because we already have case-lambda (and match-lambda in SRFI 204).

Yeah, I’m not totally fixed on the name. I think a suffix is slightly better because there is, to my knowledge, no tradition of forms of ‘define’ with prefix names. But I’m happy to bikeshed it later — this is just a proof of concept, really.

> Do you think that a version where the values of the previous arguments are not bound is that much useful?  Of course, it is a nice symmetry with let and let*, but does this already warrant this (slight) complication of an optionals spec?

One might well ask why we have both let and let* to begin with. (Clojure, I believe, has only one let form which is essentially our let*.)

The slight efficiency gain from only having one extra procedure call internally when possible seems potentially worth it to me.

> As for the surface syntax, the rest argument should be detectable even without any optionals specified.  For otherwise, the behavior becomes irregular.  So
>
> (opt-lambda (x y (z a) . rest)
>   ...)
>
> and not
>
> (opt-lambda (x y (z a) rest)
>   ...)

That’s how it’s meant to work, but I think at present the latter will match as well, and do something weird, because controlling what patterns match what input like that in syntax-rules is moderately tricky. An implementation in SRFI 148 or syntax-case would a lot shorter and more robust against foibles like this.

> Incidentally, the first syntax does not clash with the normal lambda syntax, so it can be used as a drop-in replacement for lambda.  So as part of a standard, both can become the same, simplifying the language.

Yes, the second clause of the top-level lambda-optional[*] form implementation shows that it expands to a regular lambda in the degenerate case with no optional parameters.

> Marc

Daphne