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

29 Multiple Values

Carl Eastlund <cce@racket-lang.org>

 (require unstable/values)

This library is unstable; compatibility will not be maintained. See Unstable for more information.

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)