DOC HOME SITE MAP MAN PAGES GNU INFO SEARCH
 

(guile.info.gz) Multiple Values

Info Catalog (guile.info.gz) Continuations (guile.info.gz) Control Mechanisms (guile.info.gz) Exceptions
 
 26.6 Returning and Accepting Multiple Values
 ============================================
 
 Scheme allows a procedure to return more than one value to its caller.
 This is quite different to other languages which only allow
 single-value returns.  Returning multiple values is different from
 returning a list (or pair or vector) of values to the caller, because
 conceptually not _one_ compound object is returned, but several
 distinct values.
 
    The primitive procedures for handling multiple values are `values'
 and `call-with-values'.  `values' is used for returning multiple values
 from a procedure.  This is done by placing a call to `values' with zero
 or more arguments in tail position in a procedure body.
 `call-with-values' combines a procedure returning multiple values with
 a procedure which accepts these values as parameters.
 
  -- Scheme Procedure: values . args
  -- C Function: scm_values (args)
      Delivers all of its arguments to its continuation.  Except for
      continuations created by the `call-with-values' procedure, all
      continuations take exactly one value.  The effect of passing no
      value or more than one value to continuations that were not
      created by `call-with-values' is unspecified.
 
  -- Scheme Procedure: call-with-values producer consumer
      Calls its PRODUCER argument with no values and a continuation
      that, when passed some values, calls the CONSUMER procedure with
      those values as arguments.  The continuation for the call to
      CONSUMER is the continuation of the call to `call-with-values'.
 
           (call-with-values (lambda () (values 4 5))
                             (lambda (a b) b))
                                                        ==>  5
 
           (call-with-values * -)                             ==>  -1
 
    In addition to the fundamental procedures described above, Guile has
 a module which exports a syntax called `receive', which is much more
 convenient.  If you want to use it in your programs, you have to load
 the module `(ice-9 receive)' with the statement
 
      (use-modules (ice-9 receive))
 
  -- library syntax: receive formals expr body ...
      Evaluate the expression EXPR, and bind the result values (zero or
      more) to the formal arguments in the formal argument list FORMALS.
      FORMALS must have the same syntax like the formal argument list
      used in `lambda' ( Lambda).  After binding the variables,
      the expressions in BODY ... are evaluated in order.
 
Info Catalog (guile.info.gz) Continuations (guile.info.gz) Control Mechanisms (guile.info.gz) Exceptions
automatically generated byinfo2html