[R6RS] multiple-value binding

Anton van Straaten anton at appsolutions.com
Thu Mar 2 02:25:24 EST 2006

> Well, these are short but don't fix the *-placement problem.  let/v*
> has the same problem as let-values* in that the * isn't really in the
> right place

My thought was that the * in let/v* is a bit closer to where it should 
be.  Some squinting may be required...

>>I have a question about the overall rationale here: with an alternate 
>>form like mvlet, which is designed to support both single and multiple 
>>values well, should the original LET end up being deprecated (except for 
>>the named let form)?  After all, mvlet will have the same syntax as LET, 
>>for single values.  Alternatively, should they be considered coequal, 
>>intended to support two different programming styles?  While we may not 
>>get to decide what happens in practice, we may want to explain what is 
> The syntax is not the same for single values.  To bind a single value
> with mvlet, you need to wrap the variable in parens, like this:
>   (mvlet ([(x) e]) ---)

That doesn't match my understanding of the syntax given for option 4:

  (let ([idspec expr] ...) body)

    idspec -> id | vidspec
    vidspec -> (values . id) | (values id ...) | (values id id ... . id)

This gives:

  (let ([idspec expr] ...) body)

and one of the cases for 'idspec' is 'id', which gives:

  (let ([id expr] ...) body)

which I thought was the syntax for binding a single value.

That was what I was voting for, because it avoids "extra" parens in the 
single-value case, while being fully general for multiple values.

> I would not want to deprecate let in any case because of its simplicity
> and close relationship with lambda.  In fact, I'd like to see let in
> the core language and mvlet in a library.

That answers my question, thanks.


More information about the R6RS mailing list