DOC HOME SITE MAP MAN PAGES GNU INFO SEARCH
 

(r5rs.info.gz) Iteration

Info Catalog (r5rs.info.gz) Sequencing (r5rs.info.gz) Derived expression types (r5rs.info.gz) Delayed evaluation
 
 4.2.4 Iteration
 ---------------
 
 
 
  -- library syntax: do ((<variable1> <init1> <step1>) ...) (<test>
           <expression> ...) <command> ...
      `Do' is an iteration construct.  It specifies a set of variables to
      be bound, how they are to be initialized at the start, and how
      they are to be updated on each iteration.  When a termination
      condition is met, the loop exits after evaluating the
      <expression>s.
 
      `Do' expressions are evaluated as follows: The <init> expressions
      are evaluated (in some unspecified order), the <variable>s are
      bound to fresh locations, the results of the <init> expressions
      are stored in the bindings of the <variable>s, and then the
      iteration phase begins.
 
      Each iteration begins by evaluating <test>; if the result is false
      (see section  Booleans), then the <command> expressions are
      evaluated in order for effect, the <step> expressions are
      evaluated in some unspecified order, the <variable>s are bound to
      fresh locations, the results of the <step>s are stored in the
      bindings of the <variable>s, and the next iteration begins.
 
      If <test> evaluates to a true value, then the <expression>s are
      evaluated from left to right and the value(s) of the last
      <expression> is(are) returned.  If no <expression>s are present,
      then the value of the `do' expression is unspecified.
 
      The region of the binding of a <variable> consists of the entire
      `do' expression except for the <init>s.  It is an error for a
      <variable> to appear more than once in the list of `do' variables.
 
      A <step> may be omitted, in which case the effect is the same as
      if `(<variable> <init> <variable>)' had been written instead of
      `(<variable> <init>)'.
 
      (do ((vec (make-vector 5))
           (i 0 (+ i 1)))
          ((= i 5) vec)
        (vector-set! vec i i))               ==>  #(0 1 2 3 4)
 
      (let ((x '(1 3 5 7 9)))
        (do ((x x (cdr x))
             (sum 0 (+ sum (car x))))
            ((null? x) sum)))                ==>  25
 
 
  -- library syntax: let <variable> <bindings> <body>
      "Named `let'" is a variant on the syntax of `let' which provides a
      more general looping construct than `do' and may also be used to
      express recursions.  It has the same syntax and semantics as
      ordinary `let' except that <variable> is bound within <body> to a
      procedure whose formal arguments are the bound variables and whose
      body is <body>.  Thus the execution of <body> may be repeated by
      invoking the procedure named by <variable>.
 
      (let loop ((numbers '(3 -2 1 6 -5))
                 (nonneg '())
                 (neg '()))
        (cond ((null? numbers) (list nonneg neg))
              ((>= (car numbers) 0)
               (loop (cdr numbers)
                     (cons (car numbers) nonneg)
                     neg))
              ((< (car numbers) 0)
               (loop (cdr numbers)
                     nonneg
                     (cons (car numbers) neg)))))
                ==>  ((6 1 3) (-5 -2))
 
 
Info Catalog (r5rs.info.gz) Sequencing (r5rs.info.gz) Derived expression types (r5rs.info.gz) Delayed evaluation
automatically generated byinfo2html