Next: Sequencing, Previous: Quoting, Up: Special Forms
The behavior of the conditional expressions is determined by
whether objects are true or false. The conditional expressions count
only #f as false. They count everything else, including
#t, pairs, symbols, numbers, strings, vectors, and procedures as
true (but see True and False).
In the descriptions that follow, we say that an object has “a true value” or “is true” when the conditional expressions treat it as true, and we say that an object has “a false value” or “is false” when the conditional expressions treat it as false.
Predicate, consequent, and alternative are expressions. An
ifexpression is evaluated as follows: first, predicate is evaluated. If it yields a true value, then consequent is evaluated and its value is returned. Otherwise alternative is evaluated and its value is returned. If predicate yields a false value and no alternative is specified, then the result of the expression is unspecified.An
ifexpression evaluates either consequent or alternative, never both. Programs should not depend on the value of anifexpression that has no alternative.(if (> 3 2) 'yes 'no) => yes (if (> 2 3) 'yes 'no) => no (if (> 3 2) (- 3 2) (+ 3 2)) => 1
(predicate expression ...)where predicate is any expression. The last clause may be an
elseclause, which has the form:(else expression expression ...)A
condexpression does the following:
- Evaluates the predicate expressions of successive clauses in order, until one of the predicates evaluates to a true value.
- When a predicate evaluates to a true value,
condevaluates the expressions in the associated clause in left to right order, and returns the result of evaluating the last expression in the clause as the result of the entirecondexpression.If the selected clause contains only the predicate and no expressions,
condreturns the value of the predicate as the result.- If all predicates evaluate to false values, and there is no
elseclause, the result of the conditional expression is unspecified; if there is anelseclause,condevaluates its expressions (left to right) and returns the value of the last one.(cond ((> 3 2) 'greater) ((< 3 2) 'less)) => greater (cond ((> 3 3) 'greater) ((< 3 3) 'less) (else 'equal)) => equalNormally, programs should not depend on the value of a
condexpression that has noelseclause. However, some Scheme programmers prefer to writecondexpressions in which at least one of the predicates is always true. In this style, the final clause is equivalent to anelseclause.Scheme supports an alternative clause syntax:
(predicate => recipient)where recipient is an expression. If predicate evaluates to a true value, then recipient is evaluated. Its value must be a procedure of one argument; this procedure is then invoked on the value of the predicate.
(cond ((assv 'b '((a 1) (b 2))) => cadr) (else #f)) => 2
Key may be any expression. Each clause has this form:
((object ...) expression expression ...)No object is evaluated, and all the objects must be distinct. The last clause may be an
elseclause, which has the form:(else expression expression ...)A
caseexpression does the following:
- Evaluates key and compares the result with each object.
- If the result of evaluating key is equivalent (in the sense of
eqv?; see Equivalence Predicates) to an object,caseevaluates the expressions in the corresponding clause from left to right and returns the result of evaluating the last expression in the clause as the result of thecaseexpression.- If the result of evaluating key is different from every object, and if there's an
elseclause,caseevaluates its expressions and returns the result of the last one as the result of thecaseexpression. If there's noelseclause,casereturns an unspecified result. Programs should not depend on the value of acaseexpression that has noelseclause.For example,
(case (* 2 3) ((2 3 5 7) 'prime) ((1 4 6 8 9) 'composite)) => composite (case (car '(c d)) ((a) 'a) ((b) 'b)) => unspecified (case (car '(c d)) ((a e i o u) 'vowel) ((w y) 'semivowel) (else 'consonant)) => consonant
The expressions are evaluated from left to right, and the value of the first expression that evaluates to a false value is returned. Any remaining expressions are not evaluated. If all the expressions evaluate to true values, the value of the last expression is returned. If there are no expressions then
#tis returned.(and (= 2 2) (> 2 1)) => #t (and (= 2 2) (< 2 1)) => #f (and 1 2 'c '(f g)) => (f g) (and) => #t
The expressions are evaluated from left to right, and the value of the first expression that evaluates to a true value is returned. Any remaining expressions are not evaluated. If all expressions evaluate to false values, the value of the last expression is returned. If there are no expressions then
#fis returned.(or (= 2 2) (> 2 1)) => #t (or (= 2 2) (< 2 1)) => #t (or #f #f #f) => #f (or (memq 'b '(a b c)) (/ 3 0)) => (b c)