On this page:
values->list
map2
map/ values
foldr/ values
foldl/ values

2 Multiple Values

 (require (planet cce/scheme:7:5/values))

This module provides tools for manipulating functions and expressions that produce multiple values.

(values->list expr)
Produces a list of the values returned by expr.

Example:

> (values->list (values 1 2 3))

'(1 2 3)

(map2 f lst ...)  
(listof B) (listof C)
  f : (-> A ... (values B C))
  lst : (listof A)
Produces a pair of lists of the respective values of f applied to the elements in lst ... sequentially.

Example:

> (map2 (lambda (x) (values (+ x 1) (- x 1))) (list 1 2 3))

'(2 3 4)

'(0 1 2)

(map/values n f lst ...)  
(listof B_1) ... (listof B_n)
  n : natural-number/c
  f : (-> A ... (values B_1 ... B_n))
  lst : (listof A)
Produces lists of the respective values of f applied to the elements in lst ... sequentially.

Example:

> (map/values
   3
   (lambda (x)
     (values (+ x 1) x (- x 1)))
   (list 1 2 3))

'(2 3 4)

'(1 2 3)

'(0 1 2)

(foldr/values f vs lst ...)  
B ...
  f : (-> A ... B ... (values B ...))
  vs : (list/c B ...)
  lst : (listof A)
(foldl/values f vs lst ...)  
B ...
  f : (-> A ... B ... (values B ...))
  vs : (list/c B ...)
  lst : (listof A)
These functions combine the values in the lists lst ... using the multiple-valued function f; foldr/values traverses the lists right to left and foldl/values traverses left to right.

Examples:

(define (add/cons a b c d)
  (values (+ a c) (cons b d)))
> (foldr/values add/cons (list 0 null)
                (list 1 2 3 4) (list 5 6 7 8))

10

'(5 6 7 8)

> (foldl/values add/cons (list 0 null)
                (list 1 2 3 4) (list 5 6 7 8))

10

'(8 7 6 5)