« 連載: Smalltalk use: better《17》私より大きいなら私より小さいかな★★ | トップページ | 連載: Smalltalk use: better《19》文字列と数列は何が違うの(1)★ »

2006年8月 9日 (水)

連載: Smalltalk use: better《18》あなたの大きいは私のとは違うかな★

キーワード ◆ +・<・>・メソッド・メッセージ・実数・整数・大小比較

※ PDF でご覧になるなら ⇒ 公開日まで、お待ちください。

------------ 序 ------------

◆ やがて、学年が進むと、掛け算を覚え、割り算を教わります。「5÷3 は?」と尋ねたら「割れきれないから、余りがにぃ〜」と得意顔で答える子供も中にはいます。その子に「それができるのよ」と教えようとすると「だめだよ、余りがでるもん」と怪訝そうな顔をされるかもしれません。そこで「÷ を / に変えてみるのよ」と無理強いをすると「大人って馬鹿じゃない」と相手にされなくなるかもしれません。さらに…(続く)

◆ ファイルシステムによっては、大文字小文字を区別しないものが存在します。その場合、同じ綴りでありながら、大文字と小文字との違いだけがある名前を持つファイルを、同じフォルダー内に作成できません。たとえば、'File' と 'file' とは、これらをファイル名と見なすと、その見掛けと違って、同じ名前として認識されます。なぜこのような事態になるかというと…

------------ 本文 ------------

◆ 2つの文字の大小比較を再定義します。

lT := [:Self :aCharacter |
    Self asUppercase asciiValue
    < aCharacter asUppercase asciiValue].
lT value: $A value: $a.    "false"

< に相当する、ブロック lt について考えます。lT を < と見なすと、
 lT value: $A value: $a
は、
 $A < $a
に相当します。つまり、文字 $A に対して、メッセージ < $a を送ることで、2つの文字を「大文字と小文字とを区別せずに」大小比較した結果が得られます。

lt := [:Self :aCharacter |
    Self asciiValue < aCharacter asciiValue].
gt := [:Self :aCharacter |
    lt value: aCharacter value: Self].
lt value: $A value: $a.    "true"
gt value: $a value: $A.    "true"

60809a

< に相当する、ブロック lt について考えます。lt を < と見なすと、
 lt value: $A value: $a
は、
 $A < $a
に相当します。つまり、文字 $A に対して、メッセージ < $a を送ることで、2つの文字を「ASCII コードの値に基づいて」大小比較した結果が得られます。

> に相当する、ブロック gt について考えます。gt を > と見なすと、
 gt value: $a value: $A
は、
 $a > $A
に相当します。つまり、文字 $a に対して、メッセージ > $A を送ることで、2つの文字を「ASCII コードの値に基づいて」大小比較した結果が得られます。

◆ 一般に、a < b と b > a とは、同じ結果が得られるものと期待されます。しかし、a と b とが違う種類のオブジェクトであると、その思惑が外れることがあります。その理由を説明する前に、大小比較ではなく、加算を表す演算 + について考察します。

3 + 4        "7"
3 + 4.0    "7.0"
3.0 + 4    "7.0"
3.0 + 4.0    "7.0"

60809b ◆ 数学の世界では、同じ + に対して、整数も実数も同じ演算がなされるものと期待されます。しかし、計算機の世界では、同じ + に対して、整数と実数とでは違う演算がなされることが期待されます。たとえば、実数を表すビットパターンに対して、整数を対象とする演算 + を適用しても無意味です。なぜなら、整数と実数とでは、その内部表現が異なるからです。再び、大小比較を表す演算について考察します。

【課題】何が問題となっているのか
3+4.0 を評価すると、7.0 となるのは何故でしょう。

60809c ◆ $A と $a とが、違う種類のオブジェクトと仮定します。すると、a < b と b > a とは、必ずしも同じ結果にならない可能性があることに気付きます。ここで、$A は「大文字と小文字とを区別せずに」大小比較する種類の文字とします。$a は「ASCII コードの値に基づいて」大小比較する種類の文字とします。すると、次のように`奇妙な`現象が起こり得ます。

$A < $a    "false"
$a > $A    "true"

◆ < および > によって、どのメソッドが有効かを決定するのは、メッセージの受信者であるオブジェクト自身です。メッセージそのものに決定権はありません。

==================================
真樹育未 著 ◆ 監修:小泉ひよ子とタマゴ倶楽部

|

« 連載: Smalltalk use: better《17》私より大きいなら私より小さいかな★★ | トップページ | 連載: Smalltalk use: better《19》文字列と数列は何が違うの(1)★ »

Squeak/Smalltalk」カテゴリの記事

.連載: Smalltalk use: better」カテゴリの記事

コメント

コメントを書く



(ウェブ上には掲載しません)




トラックバック


この記事へのトラックバック一覧です: 連載: Smalltalk use: better《18》あなたの大きいは私のとは違うかな★:

« 連載: Smalltalk use: better《17》私より大きいなら私より小さいかな★★ | トップページ | 連載: Smalltalk use: better《19》文字列と数列は何が違うの(1)★ »