The multiple-value feature was added in R5RS.
Function: call-with-values
thunk
receiver
Call its
thunk
argument with a continuation that, when passed some values, calls thereceiver
procedure with those values as arguments.
Syntax: let-values
((formals
expression
) ...
) body
Each
formals
should be a formal arguments list as for alambda
, cf section 4.1.4 of the R5RS.The
expression
s are evaluated in the current environment, the variables of theformals
are bound to fresh locations, the return values of theexpression
s are stored in the variables, thebody
is evaluated in the extended environment, and the values of the last expression ofbody
are returned. Thebody
is a "tail body", cf section 3.5 of the R5RS.The matching of each
formals
to values is as for the matching offormals
to arguments in alambda
expression, and it is an error for anexpression
to return a number of values that does not match its correspondingformals
.(let-values (((a b . c) (values 1 2 3 4))) (list a b c)) --> (1 2 (3 4)) (let ((a 'a) (b 'b) (x 'x) (y 'y)) (let-values (((a b) (values x y)) ((x y) (values a b))) (list a b x y))) --> (x y a b)
Syntax: let*-values
((formals
expression
) ...
) body
Each
formals
should be a formal arguments list as for alambda
expression, cf section 4.1.4 of the R5RS.
let*-values
is similar tolet-values
, but the bindings are performed sequentially from left to right, and the region of a binding indicated by (formals
expression
) is that part of thelet*-values
expression to the right of the binding. Thus the second binding is done in an environment in which the first binding is visible, and so on.(let ((a 'a) (b 'b) (x 'x) (y 'y)) (let*-values (((a b) (values x y)) ((x y) (values a b))) (list a b x y))) --> (x y x y)
Syntax: receive
formals
expression
body
The
formals
,expression
, andbody
are as described in R5RS. Specifically,formals
can have any of three forms:
- ‘
(
’variable1
...variablen
)The environment in which the receive-expression is evaluated is extended by binding
variable1
, ...,variablen
to fresh locations. Theexpression
is evaluated, and its values are stored into those locations. (It is an error ifexpression
does not have exactlyn
values.)- ‘
’
variable
The environment in which the receive-expression is evaluated is extended by binding
variable
to a fresh location. Theexpression
is evaluated, its values are converted into a newly allocated list, and the list is stored in the location bound tovariable
.- ‘
(
’variable1
...variablen
.variablen+1
)The environment in which the receive-expression is evaluated is extended by binding
variable1
, ...,variablen+1
to fresh locations. Theexpression
is evaluated. Its firstn
values are stored into the locations bound tovariable1
...variablen
. Any remaining values are converted into a newly allocated list, which is stored into the location bound tovariablen+1
(It is an error ifexpression
does not have at leastn
values.)In any case, the expressions in
body
are evaluated sequentially in the extended environment. The results of the last expression in the body are the values of the receive-expression.