Re: A case for let-optionals and let-keywords (Was: Re: [scheme-reports-wg2] Re: R7RS-large backward compatibility) Lassi Kortela 09 Mar 2020 09:16 UTC
> `let-optionals' has the advantage that we do no need any heavy new > syntax to call and to define procedures taking optional arguments. It > also has the advantage that no new concept is needed (namely that of > keyword arguments). > > It is no full replacement for keyword arguments, though. You can > meaningfully redo a procedure like `fox' from SRFI 183 with keyword > arguments but not with optional arguments in the sense of `let-optionals'. Agreed. As Amirouche mentioned, there's a similar `let-keywords` in Chibi. IMHO it has the same problem: it's not part of a standard lambda list definition, so it's harder for humans and machines to analyze. > Thus, the answer also depends on whether we want and need to have the > full power of keyword arguments (and the full potential of abusing them) > in R7RS-large or whether we think it is possible and sensible to stick > to the way optional arguments have been handled so far in > R7RS-small/R7RS-large. IMHO we should consider the prior art here. People have written large Lisp systems for decades. If one can be found that avoids keyword args and is still easy to read, it would make for a good case study. In Emacs, the parts lifted from (or inspired by) CL use keyword args, and they are easier to read than the parts using positional optional args. RMS didn't like keyword arguments so they were kept out for long. > I haven't understood Lassi's argument about standardization, though. As > much as `call/kw' can be standardized, so can `let-optionals'. Sorry, I was using the word "standard" ambiguously. I mean standardization in the sense that different programmers would do the same task the same way, i.e. conventions. If optional arguments are done via case-lambda or SRFI 89, it's easier to write tools like a documentation generator or an optimizer since those tools have a standard place where to look for optional (and keyword) arguments. If it's just ordinary Scheme code matching on a lambda-list, the analysis for tools (and humans) to figure out whether it parses the procedure's arguments, or something else entirely, becomes harder. Every time I see a let-optionals or let-keywords, I need to stop and verify what it's doing. I've never had that feeling in Common Lisp, where optional and keyword args are always in a natural place in the lambda list itself. CL also has destructuring-bind (similar to Scheme's ` match`; a superset of let-optionals) for arbitrary lists. You can use it to parse a rest argument, but people always use the standard optional and keyword arguments. The convention makes code easy to read and process. I'd like to have similar conventions for Scheme; hence a standard case-lambda is a step in the right direction, and a standard lambda/kw or define/kw (or their superset) could be another. > Some may > even say that the advantage of the latter is that it has been in use for > a long time (for example, the reference implementation of SRFI 1 from > 1998/99 is already using `let-optionals'). Keyword arguments have been used for decades in Lisp. If they were a new invention, I'd be more suspicious.