「schemeによる記号処理入門」P.41 ~ P.42
eq? と equal?
;; eq? equal? eqv? (eq? (list 1 2 3)(list 1 2 3)) ;; => #f (equal? (list 1 2 3)(list 1 2 3)) ;; => #t (eq? (cons 1 '(2 3))(cons 1 '(2 3))) ;; => #f (equal? (cons 1 '(2 3))(cons 1 '(2 3))) ;; => #t (eq? '(1 2 3)'(1 2 3)) ;; => #f (equal? '(1 2 3)'(1 2 3)) ;; => #t (define x '(1 2 3)) (define y '(1 2 3)) (define z x) (eq? x y) ;; => #f (equal? x y) ;; => #t (eq? x '(1 2 3)) ;; => #f (eq? x x) ;; => #t (eq? x z) ;; => #t (equal? x '(1 2 3)) ;; => #t
eqv?と=
- (eq? x y)の評価値が#tなら(eqv? x y)の評価値も#t
- (eqv? x y)が数同士の等値性の判定の場合、等しければ#t
- (eqv? x y)の評価値が#tなら(equal? x y)の評価値も#t
追記
eq?,eqv?,equal?では,等しいと判定される判断基準が異なる.
* eq?は,比較する2つの引数がシステム内部で同一のデータ(セル)を指し示している場合に#tを返す.
* eqv?は,eq?で等しいか数値として等しい2つの引数が与えられたとき#tを返す.
* equal?は,評価した結果が等しいような2つの引数が与えられたとき#tを返す.
* eq?で等しいと判定されるデータは,eqv?,equal?でも等しい.
* eqv?で等しいと判定されるデータは,equal?でも等しい.
* equal?で等しいと判定されるデータがeqv?,eq?で等しいとは限らない.
* eqv?で等しいと判定されるデータがeq?で等しいとは限らない.
* equal?は汎用的.eq?は高速.
直観的には,
* symbolの比較には,eq?
* symbolと数値を同時に扱う場合は,eqv?(数値のみを扱う場合は,"="の方がよい)
* listの構造の比較には,equal?
を使う.
0 件のコメント:
コメントを投稿