もうちょっと述語

8章3節、真偽値に関する手続き。

等価述語以外の述語

前回は等価述語だったけど、等価述語以外にも述語はたくさんありますよ、と。
型を判定したり、値の性質を判定したり。
詳しくは追々出てくるっぽい。

Schemeには述語を引数にとったり、述語を返したりするいわゆる高階関数がたくさんある。

否定

真偽を逆転するnot手続きは以下。

gosh> (not #t)
#f
gosh> (not #f)
#t

うん、かんたん。

述語を引数にとる手続き

anyとeveryの2つの手続きが登場。
これらは述語とリストを受け取って、リストの中に述語を満たすものがあるかどうか調べる手続き。
anyは、リストの要素が1つでも述語を満たすものがあれば#tになる。
everyは、リストの要素全てが述語を満たせば#tになる。

gosh> (any odd? '(1 2 3 4))
#t
gosh> (any odd? '(2 4 6))
#f
gosh> (every odd? '(1 2 3 4))
#f
gosh> (every odd? '(1 3 5))
#t

うん、簡単。


次は、any-predとevery-pred。両方共複数の述語を引数に取り、述語を返す。
any-predは、受け取った述語のうち1つでも満たせば#tを返す述語を返す。
every-predの方は、受け取った述語をすべて満たせば#tを返す述語を返す。

gosh> (define positive-integer? (every-pred integer? positive?))
positive-integer?
gosh> (positive-integer? 4)
#t
gosh> (positive-integer? -3)
#f
gosh> (positive-integer? 2.4)
#f


最後に、comprement。
comprementは引数で受け取った述語が、#tを返すような値に対して#fを返し、#fを返すような値に対して#tを返す述語を返す。

gosh> (define nonpositive? (comprement positive?))
nonpositive?
gosh> (nonpositive? 5)
#f
gosh> (nonpositive? -3)
#t

あまのじゃくな手続きができた。