The multiple-value feature was added in R5RS.
Delivers all of its arguments to its continuation.
Procedure: call-with-values producer consumer
Calls its
producerargument with no arguments and a continuation that, when passed some values, calls theconsumerprocedure with those values as arguments.(call-with-values (lambda () (values 4 5)) (lambda (a b) b)) ⇒ 5 (call-with-values * -) ⇒ -1Performance note: If either the
producerorconsumeris a fixed-arity lambda expression, it is inlined.
Syntax: define-values formalsexpression
It is an error if a variable appears more than once in the set of
formals.The
expressionis evaluated, and theformalsare bound to the return values in the same way that theformalsin alambdaexpression are matched to the arguments in a procedure call.(define-values (x y) (integer-sqrt 17)) (list x y) ⇒ (4 1) (let () (define-values (x y) (values 1 2)) (+ x y)) ⇒ 3
Syntax: let-values ((formalsexpression) ...) body
Each
formalsshould be a formal arguments list, as for alambda.The
expressions are evaluated in the current environment, the variables of theformalsare bound to fresh locations, the return values of theexpressions are stored in the variables, thebodyis evaluated in the extended environment, and the values of the last expression ofbodyare returned. Thebodyis a "tail body", cf section 3.5 of the R5RS.The matching of each
formalsto values is as for the matching offormalsto arguments in alambdaexpression, and it is an error for anexpressionto 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 ((formalsexpression) ...) body
Each
formalsshould be a formal arguments list as for alambdaexpression.
let*-valuesis similar tolet-values, but the bindings are performed sequentially from left to right, and the region of a binding indicated by (formalsexpression) is that part of thelet*-valuesexpression 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 formalsexpressionbody
This convenience form (from SRFI-8) is equivalent to:
(let-values ((formalsexpression))body)For example:
(receive a (values 1 2 3 4) (reverse a)) ⇒ (4 3 2 1) (receive (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)) (receive (a b) (values x y) (receive (x y) (values a b) (list a b x y)))) ⇒ (x y x y)
Procedure: values-append arg1 ...
The values resulting from evaluating each argument are appended together.