大部分分支函数,像<,string?,结果是#t,#f。Racket对待所有非#f都当成#t。
这种机制可以用#f代表失败或者可选值不存在。(但是不要过度使用这种机制,异常更适合用来处理失败)
比如member函数可以同时负担两个职责。它可以用来查找列表里以某一项开始的剩余列表,也可以用来判断一个项是否存在列表中。
4.7.1简单分支:if
(if test-expr then-expr else-expr)
if形式必须同时有then-expr和else-expr,else-expr不是可选的。使用when或者unless可以达到只有一个表达式的目的。
4.7.2合并测试:and 或者 or
and和or是语法形式,不是函数。不想函数,and和or形式可以跳过执行和后面的表达式如果前面的表达式得出了结果。
(and expr ...)
and返回#f如果任何表达式的值是#f。否者返回最后一个表达式的值。
(or expr ...)
or形式返回#f如果所有的表达式都是#f。否则,返回第一个不是#f的值。
(define (get-milk? lst)
(and (not (null? lst))
(or (eq? 'milk (car lst))
(get-milk? (cdr lst)))))
and和or执行直到最后一个表达式,然后表达式的值直接返回成结果。所以上面表达式是常量空间内求值。
4.7.3链式测试:cond
(cond [test-expr body ...+]
...)
每个test表达式都是顺序执行。最后一个表达式可以用else。如果else没有使用,有没有表达式匹配,则返回<code>#void</code>
(cond cond-clause ...)
cond-clause=[test-expr then-body ...+]
|[else then-body ...+]
|[test-expr => proc-expr]
|[test-expr]
=>变种表示如果匹配结果为#t,则船体结果给后面函数,但是函数只能是单阐述的。
单独一个测试表达式很少被使用,它返回表达的值。
网友评论