• 検索結果がありません。

3. その結果を表示する

3.7 等価性判定

> (string=? "a b" "a b")

#t

> (string=? "a b" "a b c")

#f

> (string-ci=? "a b" "A B")

#t

> (string<? "aa" "ab")

#t

> (string<? "aa" "a")

#f

> (string>? "aba" "aaa")

#t

なお、 それぞれの文字についての大小関係は次の通りに定められています。

大文字

:

"A"

<

"B"

< ::: <

"Z"

小文字

:

"a"

<

"b"

< ::: <

"z"

数字

:

"0"

<

"1"

< ::: <

"9"

大文字と小文字

:

"A"

<

"a"

,

"B"

<

"b"

,...

各数字はどの大文字より小さい15

各数字はどの小文字より小さい16

これらの手続きはいずれも、

2

つの引数hデータ1i hデータ2i

(

それぞれの手続きの意

味で

)

同じであれば真 #t を、そうでなければ偽 #f を返します。

もし与えられた

2

つの引数が同一であれば 、どの手続きも #t を返します。ここで「同 一」とは、

2

つの引数の実体が計算機の記憶領域の中で同一の場所にある、という意味で す。

2

つのものが同じ記憶番地にあれば 、

2

つは同一のものです。画面に表示させるとまっ たく同じでも記憶番地が違えば 、もし一方が書き換えられるとそれらは違うものになって しまいます。

> (define qwe '(have fun))

#<unspecified>

> (eqv? qwe qwe)

#t

> (eq? qwe qwe)

#t

> (equal? qwe qwe)

#t

この例では同一のものを比較していますので、比較結果はいずれも #tになっています。

もし

2

つの引数の型が違うと、比較結果は必ず #fになります。

> (eqv? 'abc "2")

#f

> (eq? 'abc 3.14)

#f

> (equal? "3.14" 3.14)

#f

手続きeqv? は、次のいずれかの場合に #tを返します。

2

つの引数がともに #t、 またはともに #f のとき。

2

つの引数がともに記号で、 同じ文字のならびであるとき。

2

つの引数がともに数で、しかも数値として同じであり、さらにともに整数もしくは ともに実数のとき。

2

つの引数がともに空リストのとき。

2

つの引数がともに対、ベクトル、あるいは文字列で、同一の記憶番地にあるとき。

2

つの引数がともに手続きで 、同一の記憶番地にあるとき。

(

手続きについては 、次 節で説明します。

)

例を見てみましょう。

> (eqv? 'abc 'abc)

#t

> (eqv? 'foo 'bar)

#f

> (eqv? '() '())

#t

> (eqv? 16 16)

#t

> (eqv? 16 (* 2 8))

#t

> (eqv? 16 16.0)

#f

> (eqv? (list 'pooh 'piglet) (list 'pooh 'piglet))

#f

> (define animal (list 'pooh 'piglet))

#<unspecified>

> (eqv? animal animal)

#t

eqv?は、文字列やリストの比較のときは、メモリアドレスが同一かど うかで等価性の判定をし ます。例として (eqv? "A" "A")のように定数データの比較の場合を考えましょう。

2

つのデー

タが同一のメモリアドレスのものとなるど うかは処理系に依存しています。これらは定数なので、

ある処理系はあるメモリアドレスに文字列を "A"を置き、eqv?

2

つの引数に同じものを与え るあるかもしれませんし 、別の処理系ではそうしないかも知れません。このために、定数データ同 士の比較は処理系に依存するので避けるべきです。同じ理由により、(eqv? '(1 2) '(1 2)) (eqv? '(b) (cdr '(a b)))のような使い方もしないでください。

手続きeq? は、

2

つの引数が同一

(

同一のメモリアドレス

)

にあるときに#tを返します。

eq? は eqv? と似ています。ですが 、数値的に同じでも記憶場所の違う数の比較のときに

#tを返すかど うかは

Scheme

の言語仕様では規定されていないので、そういった使い方は しないでください。数の比較には eq? は使わず、数同士の比較をする手続き=

,

eqv? ある

いは後述の equal? を使ってください。

> (eq? 'a 'a)

#t

> (eq? 'a 'b)

#f

> (eq? (list 'pooh 'piglet) (list 'pooh 'piglet))

#f

> (define animal (list 'pooh 'piglet))

#<unspecified>

> (eqv? animal animal)

#t

> (eq? '() '())

#t

手続きequal? は、対やベクトルなどの比較のときには、要素それぞれを比較しますが 、

さらに対やベクトルがあればそれらの要素についても、さらに等しいかど うかを調べます。

(

ベクトルは、

6.1.2

にて学びます。

)

その他

(

数や記号など

)

に対しては、eqv?と同じ方法

で同じかど うかを調べます。

(

直観的な説明ですが 、

2

つのデータが同じに表示されるとき は、equal? は #tを返す場合が多いです。

)

> (equal? '(a b) '(a b))

#t

> (equal? (list 'a 'b) (list 'a 'b))

#t

> (equal? '(a b (c d)) '(a b (c d)))

#t

> (equal? "my home" "my home")

#t

> (equal? 13 13)

#t

> (equal? 3.14 3.14)

#t

> (equal? 1 1.0)

#f