--- title: 等価性 author: kazu634 date: 2008-08-04 wordtwit_post_info: - 'O:8:"stdClass":13:{s:6:"manual";b:0;s:11:"tweet_times";i:1;s:5:"delay";i:0;s:7:"enabled";i:1;s:10:"separation";s:2:"60";s:7:"version";s:3:"3.7";s:14:"tweet_template";b:0;s:6:"status";i:2;s:6:"result";a:0:{}s:13:"tweet_counter";i:2;s:13:"tweet_log_ids";a:1:{i:0;i:4187;}s:9:"hash_tags";a:0:{}s:8:"accounts";a:1:{i:0;s:7:"kazu634";}}' categories: - gauche - Lisp ---

「二つのオブジェクトAとBが等しいとはどういうことでしょうか?」これには色々な意味があるよ。

内容が同じという場合

二つのリストがあった場合、それぞれの要素を順に比較し、全て等しければ元のリストも等しいという立場での比較。

gosh> (equal? (list 1 2 3) (list 1 2 3))
#t
gosh> (equal? (list 1 2 (list 3 4) 5) (cons 1 (cons 2 '((3 4) . (5)))))
#t
gosh> (equal? (list 1 2 3) (list 1 2 4))
#f

入れ物が同じ

他の値を入れておく入れ物の同一性を調べるもの。C言語を知っている人は、eq?はオブジェクトの「アドレス」を比較していると考えていい。

gosh> (eq? (cons 1 2) (cons 1 2))
#f
gosh> (define p (cons 1 2))
p
gosh> (eq? p p)
#t

数値として同じ

数値として比較する場合。

gosh> (eqv? 1 1)
#t
gosh> (eqv? 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> (string=? "abc" "abc")
#t
gosh> (string=? "abc" "ABC")
#f