Next: , Previous: Synchronous sequences, Up: Macros for writing loops


6.3.4 Examples

Gathering the indices of list elements that answer true to some predicate.

     (define (select-matching-items list pred)
       (reduce ((list* elt list)
                (count* i 0))
           ((hits '()))
         (if (pred elt)
             (cons i hits)
             hits)
         (reverse hits)))

Finding the index of an element of a list that satisfies a predicate.

     (define (find-matching-item list pred)
       (iterate loop ((list* elt list)
                      (count* i 0))
           ()                                ; no state variables
         (if (pred elt)
             i
             (loop))))

Reading one line of text from an input port.

     (define (read-line port)
       (iterate loop ((input* c port read-char))
           ((chars '()))
         (if (char=? c #\newline)
             (list->string (reverse chars))
             (loop (cons c chars)))
         (if (null? chars)
             (eof-object)                    ; from the PRIMITIVES structure
             (list->string (reverse chars)))))

Counting the lines in a file. This must be written in a way other than with count* because it needs the value of the count after the loop has finished, but the count variable would not be bound then.

     (define (line-count filename)
       (call-with-input-file filename
         (lambda (inport)
           (reduce ((input* line inport read-line))
               ((count 0))
             (+ count 1)))))