Gauche の真偽値と条件判断 : 1

呼称: 真偽値の判定
目的: 真偽を判定する手続きを学ぶ

Scheme では、真偽を判断する手続きを特に述語(predicate)と呼び、述語の中でも等価性を判断する手続きを等価述語(equivalence predicate)と呼びます。
また、仮引数に pred(predicate の略) を取る手続きは「引数から何かを判断して真偽値を返す手続き」と推し量れるようです。こういうちょっとした事を言及している書籍は親切心を感じますね(^ ^;;

;; 内容が同じかを判定
gosh> (equal? (list 1 2 3) (list 1 2 3))
#t
gosh> (equal? (list 1 2 3) (list 3 2 1))
#f
gosh> (equal? (list 1 2 3) '(1 2 3))
#t
gosh> (equal? (list 1 2 3) (cons 1 '(2 . (3))))
#t

;; 入れ物が同じかを判定
gosh> (eq? (list 1 2 3) (list 1 2 3))
#f
gosh> (define p (list 1 2 3))
gosh> (define q (list 1 2 3))
gosh> (eq? p p)
#t
gosh> (eq? p q)
#f

;; 数値が同じかを判定
gosh> (eqv? 1 1)
#t
gosh> (eqv? 1.0 1.0)
#t
gosh> (eq? 1.0 1.0)
#f
gosh> (equal? 1.0 1.0)
#t
gosh> (eqv? 1 1.0)
#f
; 値のみを比較
gosh> (= 1 1.0)
#t

;; 文字が同じかを判定
gosh> (char=? #\a #\a)
#t
gosh> (char=? #\a #\A)
#f
; 大文字小文字を無視
gosh> (char-ci=? #\a #\A)
#t

;; 文字列が同じかを判定
gosh> (string=? "abc" "abc")
#t
gosh> (string=? "abc" "ABC")
#f
gosh> (string-ci=? "abc" "ABC")
#t

識別子や変数名として利用されるデータ型をシンボルと呼びます。「プログラムとしてのシンボル」と「データとしてのシンボル」の二面性を持ち、シンボルの前にシングルクォートする事でデータとして扱えます。

;; プログラムとしてのシンボル
;; 変数 x を定義
gosh> (define x 3)
x
gosh> x
3

;; データとしてのシンボル
gosh> 'x
x

その他の述語や等価述語を引数に取る手続きの例。

;; 集合が同じかを判定
gosh> (use srfi-1)
gosh> (lset= eqv? '(1 2 3) '(3 1 2))
#t

;; 否定
gosh> (not (= 2 3))
#t
gosh> (not (= 2 2))
#f

;; 述語を満たす要素が最低ひとつあるか
gosh> (use srfi-1)
gosh> (any odd? '(1 2 3))
#t
gosh> (any odd? '(2 4))
#f

;; 述語を満たす要素が全てか
gosh> (use srfi-1)
gosh> (every odd? '(1 2 3))
#f
gosh> (every odd? '(1 3))
#t