« 【準備中】連載: Java.use(better) Jython はじめました《8》関数(2)★ | トップページ | 連載: Smalltalk use: better《17》私より大きいなら私より小さいかな★★ »

2006年8月 7日 (月)

連載: Smalltalk use: better《16》大きいことはいいことかな★

キーワード ◆ <・ASCII・asciiValue・Character・self・関数 __lt__・大小比較・文字

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

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

この連載は、1988〜1990年に開催した Smalltalk のセミナー用テキスト(原稿)および講義ノート(ネタ帳)をもとに、再構成したものです。当時と、基本的な枠組みは変りません。その中から、C++ と比較した記述などを、Java に変更しています。翌1991年には、James Gosling さんが(Java に改称する前の)オブジェクト指向言語 Oak の開発に着手したとされています。つまり、その時点では、Java はまだ存在すらしていませんでした。新しくて旧い Java とは異なる、旧くて新しい Smalltalk が提供する、究極のオブジェクト指向の世界へ、さあご一緒にどうぞ。

◆ 三角形の内角の和は、180 度である。二点を通る直線は、ただ1つだけ存在する。これらの常識は、非ユークリッド空間では通用しません。試しに、三角形を紙の上に描いた後で、その紙の縁をほんの少し持ち上げてみてください。すると、内角の和が 180 度より大きくなったり小さくなったりする空間が存在することに気付きます。さらに、二点を通る直線が、無数に存在する空間が存在することを、容易に想像できるようになります。同様に、Java/C# などの世界で培われた常識が通用しない、オブジェクト指向の世界が存在することを、理解できるようになるでしょう。小学校に…(続く)

◆ Java/C# などの世界では、a < b と b > a とは同じ結果が得られるというが常識です。しかし、純粋なオブジェクト指向プログラミングの世界では、この常識が通用しない場面に遭遇します。なぜなら…

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

◆ クラス Character を使って、文字の大小比較について考察します。メッセージセレクター < を使って、2つの文字を大小比較できます。

$a < $b    "true"
$a < $a    "false"
$b < $a    "false"
$A < $a    "true"
$A < $A    "false"
$a < $A    "false"

◆ 2つの文字が同じなら false が得られます。2つの文字が違うなら、その ASCII コードの値に基づいて、大小比較を行った結果が得られます。

60807a

.

.

.

$A asciiValue    "65"
$a asciiValue    "97"
$b asciiValue    "98"

60807basciiValue を使うと、ASCII コードの値が得られます。そこで、この値によって、文字の大小比較を行います。すると、大文字の後に、小文字が続くことが分かります。よって、$A < $a となります。つまり、< を使うと、2つの文字が ASCII コード順に並んでいるかを判定できます。

lt := [:c1 :c2 |
    c1 < c2].
lt value: $a value: $b        "true"

< に相当する、ブロック lt について考えます。lt を < と見なすと、
 lt value: $a value: $b
は、
 $a < $b
に相当します。つまり、文字 $a に対して、メッセージ < $b を送るのと、同等の機能を実現できます。

def __lt__(c1, c2):
    return c1 < c2
print __lt__('a', 'b')
print 'a' < 'b'
# -------------------------------- Output --
True
True

【注意】Python では、特殊な関数 __lt__ によって、演算子 < の機能を規定します。メソッド呼び出しと同等の、演算子による表記が可能になります。

lt := [:Self :aCharacter |
    Self < aCharacter].
lt value: $a value: $b        "true"

◆ ブロック lt において、その役割を明確にするために、引数の名前を変更します。引数 Self が束縛するオブジェクトが、メッセージの受け手となります。どのメソッドを適用するかは、Self が決定します。

【注意】Self という名前の引数は、メソッド本体を記述するときに、レシーバー(メッセージの受け手)を表す疑似変数 self を意識したものです。

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

< に相当する、ブロック lt について再考します。lt を < と見なすと、
 lt value: $a value: $b
は、
 $a < $b
に相当します。つまり、文字 $a に対して、メッセージ < $b を送るのと、同等の機能を実現できます。

◆ $a < $b を評価すると true が得られることから、2つの小文字が ASCII コード順に並んでいるのが分かります。$a < $a を評価すると false が得られることから、同じ文字を比較すると、つねに false となるのが分かります。$A < $A についても同様です。$b < $a を評価すると false が得られることから、2つの小文字が ASCII コード順に並んでいないのが分かります。$A < $a を評価すると true が得られることから、ASCII コードでは、大文字の後に小文字が並んでいるのが分かります。$a < $A を評価すると false が得られるのも、同様に説明できます。

60807c ◆ ブロック lt を実現するときに、オブジェクト間で、どのようにメッセージがやり取りされているかを観察します。

〔1,2〕ブロック引数 Self および aCharacter が束縛するオブジェクトに対して、メッセージ asciiValue を送ると、その ASCII コードを表す整数値が得られます。

〔3〕2つの文字の大小比較は、これらの値の大小比較によって行われます。

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

|

« 【準備中】連載: Java.use(better) Jython はじめました《8》関数(2)★ | トップページ | 連載: Smalltalk use: better《17》私より大きいなら私より小さいかな★★ »

JML/Java/Eclipse」カテゴリの記事

Jython/Python」カテゴリの記事

Squeak/Smalltalk」カテゴリの記事

C#/Visual Studio」カテゴリの記事

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

コメント

コメントを書く



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




トラックバック


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

« 【準備中】連載: Java.use(better) Jython はじめました《8》関数(2)★ | トップページ | 連載: Smalltalk use: better《17》私より大きいなら私より小さいかな★★ »