2009/05/17

[scheme]eq?, equal?, eqv?

WS0798

schemeによる記号処理入門」P.41 ~ P.42

eq? と equal?

  • (eq? x y)の評価値はxとyが同じ記憶場所(セル)に格納されているときは#tで、それ以外は#fである。xとyが数の場合の評価値は諸折系に依存して決まる。
  • (equal? x y)のっ評価値はxとyの印字意結果が同じときは#tで、それ以外は#f。
  • (eq? x y)の評価値が#tであれば、(equal? x y)のひょうかちも#tであるが、逆は必ずしも成立しない。


  • ;; 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?

    を使う.


    Schemeによる記号処理入門

    0 件のコメント:

    コメントを投稿