条件式
真偽値を返すような式を評価し,その結果次第で異なる式が実行されるような式 を条件式という.条件の真偽を判定するための式を 述語(predicate)という.一般に条件式においては,#f以外は全て真 と扱われる.ここでは,Schemeで使われる代表的な条件式を挙げる.
if
;; 差の絶対値を返す関数 > (define (asub x y) (if (< x y) (- y x) (- x y))) asub > (asub 1 2) 1 > (asub -6 -10) 4条件式ifの構造は,以下の通り.
(if <条件> <条件が真のときに実行される式> <条件が偽のときに実行される式>)まず<条件>が評価される.残りの式は,それぞれ条件が真あるいは偽のときのみ実行される.つまり条件に当てはまらない方の式は評価されない.
;; 次のifは,必ず"*"を返す > ((if #f no-such-function *) 3 4) ;; (* 3 4) 12上でも述べたように,一般に条件式においては#f以外は全て真と扱われる.
> (if 3 0 1) 0 > (if #f 0 1) 1 ;; 0も#fではないので,真. > (if 0 0 1) 0
cond
> (define (compare x y) (cond ((< x y) 'smaller) ((> x y) x 'is 'larger) (#t 'equal))) compare > (compare 1 2) smaller > (compare 1 1) equal条件式condの構造は,以下の通り.
(cond (<条件1> <式11> <式12>...) (<条件2> <式21> <式22>...) : (#t <式n1> <式n2>...))<条件1>,<条件2>...を順番に評価していって,真になる<条件i>を見つけたときに,対応する<式i1>,<式i2>...を順に評価し,最後の式の値を返す.
and
> (and #f #t) #f > (and (= 1 1) (< 1 2)) #t > (and (< 0 1) (= 3 3) (> 1 2)) #f条件式andの構造は,以下の通り.
(and <式1> <式2>...)<式>を順に評価していって,偽になるものがあれば#fを返す. このとき残りの式は評価されないので,論理積とは異なり,式の順序が重要になる. 全て偽でなかった場合は,最後に評価した式の値を返す.引数が無い場合には,#tを返す.
> (and 0 1 #t 'x '(a b c)) (a b c) > (and) #t
or
> (or #f #t) #t > (or (= 1 1) (< 1 2)) #t > (or (< 0 1) (= 3 3) (> 1 2)) #t ;; notは,引数が#fなら#t,それ以外なら#fを返す. > (or (not (= 1 1)) (eq? 'a 'b)) #f条件式orの構造は,andと同様で以下の通り.
(or <式1> <式2>...)<式>を順に評価していって,真になるものがあればその値を返す. このときやはり残りの式は評価されない. 全て真でなかった場合は,#fを返す.引数が無い場合にも,#fを返す.
> (or 0 1 #t 'x '(a b c)) 0 > (or) #f