Previous: , Up: srfi let-values   [Index]


2.7.4 Specification

Syntax: let-values ((formals expression) ...) body

Each formals should be a formal arguments list as for a lambda expression (cf section 4.1.4 of the R5RS).

The expressions are evaluated in the current environment, the variables of the formals are bound to fresh locations, the return values of the expressions are stored in the variables, the body is evaluated in the extended environment, and the values of the last expression of body are returned. The body is a tail-body (cf section 3.5 of the R5RS).

The matching of each formals to values is as for the matching of formals to arguments in a lambda expression, and it is an error for an expression to return a number of values that does not match its corresponding formals.

Examples:

(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 a lambda expression (cf section 4.1.4 of the R5RS).

let*-values is similar to let-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 the let*-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.

Example:

(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)

Previous: , Up: srfi let-values   [Index]