[srfi-11] LET-VALUES wrapup (was: Re: Another vote for more parens) Lars Thomas Hansen 04 Jan 2000 21:22 UTC

(Sorry for dropping this on the floor for 6 weeks, I guess we should
thank the editors for not vigilantly moving SRFIs to "final" status
when the draft period is up! ;)

Open issues:

  (a) Leave it alone, or add a level of parens to allow multiple sets of
      bindings.  In favor: me.
		 Against: Hilsdale, Sperber(?), and the MzScheme/DrScheme/...
                 suite of programs.  Probably most everyone else, too.

  (b) If we're adding parens, do we need to introduce LET-VALUES*,
      LETREC-VALUES?

As to (a), Erik Hilsdale writes:

>Whenever I use let-values, I always write it as
>
>  (let-values ((Formals Exp) ...) Exp ... Exp)
>
>rather than this SRFI's
>
>  (let-values (Formals Exp) Exp ... Exp)
>
>I do understand that the extra parens are annoying when there's only
>one binding, which is why I frequently use one of two other forms when
>I only care to use one binding.  When I'm thinking about monads I tend
>to use
>
>  (bind (Formals Exp) Exp ... Exp)
>
>which works just as this SRFI's version.  In most of my usual coding I
>use
>
>  (with-values Exp Consumer) ; Consumer should evaluate to a procedure
>
>because (a) I'm pretty used to cps, (b) it's an extremely short macro,
>and (c) it only uses a trifle (two spaces) more horizontal space than
>bind.

In response I can only say that I rarely think about monads and that if
I wanted to use CPS I would be fairly happy with CALL-WITH-VALUES... :-/

Looking at both my code and code written by others, the use of
LET-VALUES and CALL-WITH-VALUES varies, and clearly there are cases when
multiple bindings of multiple values are created.  This is a point in
favor of using an extra nesting level.

As to (b), adding LET-VALUES* or LET*-VALUES make sense.  LETREC-VALUES
strikes me as fairly absurd; I can see no use for it.  I see MzScheme
supports it, but it is not used even once in over 42,000 lines of Scheme
source in the MzScheme distribution.

So, proposal:  I change the spec for LET-VALUES to require the extra
level of nesting, thus facilitating

	(let-values (((a b) e1)
		     ((c d) e1))
          ...)

but also allowing syntax of the form

	(let-values ((l e1)           ; grab all results into l
		     ((a b . l) e2))  ; grab two results and rest into l
	  ...)

and introducing a compatible LET*-VALUES form (MzScheme's name for it).

Debate?

[ Mike, please hold off on finalization until the dust has settled. ]

--lars