Previous: srfi general-cond rationale, Up: srfi general-cond [Index]
The <cond clause>
production in the formal syntax of Scheme as
written by R5RS Section 7.1.3 is extended with a new option:
<cond clause> ---> ... | (<generator> <guard> => <receiver>)
where <generator>
, <guard>
and <receiver>
are all
<expression>
.
Clauses of this form have the following semantics: <generator>
is
evaluated and it may return arbitrarily many values. <guard>
is
applied to an argument list containing the values in order that
<generator>
returned. If <guard>
returns a true value for
that argument list, <receiver>
is applied with an equivalent
argument list. If <guard>
returns a false value, however, the
clause is abandoned and the next one is tried.
This port->char-list
procedure accepts an input port and returns
a list of all the characters it produces until the end.
(define (port->char-list port) (cond [(read-char port) char? => (lambda (c) (cons c (port->char-list port)))] [else '()]))
Consider now a hypothetical table-entry
procedure that accepts
two arguments, a table (perhaps a hash table) and a key to an entry that
may be in the table; it returns two values: a boolean that denotes
whether or not an entry with the given key was in the table and, if it
was, the value associated with the key. Also, a hypothetical
proj0 combinator (projection of argument 0) returns its 0th
argument and ignores all others. One might conditionally branch to a
certain body of code if the table contains the desired entry like so
with the new type of cond
clause:
(cond ... [(table-entry <table> <key>) proj0 => (lambda (present? value) ...[VALUE is bound to the value of the entry]...)] ...)
Previous: srfi general-cond rationale, Up: srfi general-cond [Index]