« 連載: Smalltalk use: better《9》基本要素の意義:変数とは★ | トップページ | 連載: Smalltalk use: better《11》はやくオブジェクトになりたいっ »

2006年5月19日 (金)

連載: Smalltalk use: better《10》基本要素の意義:式とは★

キーワード ◆ インスタンス・クラス・メタクラス・メッセージ式・リテラル・変数

※ PDF でご覧になるなら ⇒ 「piyo60519.pdf」をダウンロード

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

間違いを笑うことと、間違えた人を笑うこととは、
同じではない。

Andrew Koenig

◆ ひととおり簡単な文法を紹介するのも、今日が最後です。これで、プログラミング言語の背景にある概念や文化について学ぶための、最低限の準備が整うことになります。

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

式とは ◆ メッセージ式について再考する前に、次の例について考察します。

3 class          "SmallInteger"

◆ このメッセージ式は、すでに何度も登場しているので「そろそろ見飽きた」という声が聞こえてきそうです。オブジェクト 3 にメッセージ class を送ると、クラスオブジェクト SmallInteger が得られます。識別子 SmallInteger は変数名であり、これによって整数を表現するクラスの実体を参照できます。クラスもオブジェクトなので、これを変数に代入したり、これにメッセージを送ったりできます。

3 class class          "SmallInteger class"

◆ では、オブジェクト 3 にメッセージ class を送ると得られる、クラスオブジェクト SmallInteger に、さらにメッセージ class を送ると、何が得られるでしょうか。クラスもオブジェクトなら、これにメッセージを送ると、オブジェクトが得られるはずです。クラスにクラスを獲得するためのメッセージ class を送ると、クラスのクラスが得られるはずです。クラスもオブジェクトなら、そのクラス(オブジェクト)をインスタンスとするクラスがあってもいいはずです。これを、メタクラスと言います。そして、その結果として得られたのが SmallInteger class でした。では、この体は何でしょうか。

SmallInteger class          "SmallInteger class"

◆ 同様に、クラスの実体を束縛するクラス名(変数)にメッセージ class を送っても、やはり同じ結果 SmallInteger class が得られます。ここで注目して欲しいのは、このメッセージ式とその結果を見ると、どちらも同じ式 SmallInteger class であることが分ります。いったい、何が起こっているというのでしょう。

◆ オブジェクトを参照するには、リテラルを使って直接的に表現するか、変数を使って間接的に参照するという方法があることを、すでに紹介しました。そして、第3の方法が、これから示すメッセージ式です。

60519b_1 ◆ 結論から先に言うと、SmallInteger class の正体は、メッセージ式です。「すべてがオブジェクト」というのが原則です。これに従うと、メタクラスもオブジェクトなので、その体がどこかに存在します。クラスの場合には、それを参照する変数(クラス名)が用意されています。しかし、メタクラスの場合には、そのような変数やリテラル表記が用意してありません。そこで、メッセージ式として、つまり「メッセージを送ったときに得られるオブジェクト」という間接的な方法で、これを参照するのです。

◆ 実際のソフトウェア開発では、新たに作成したオブジェクトの大半は、リテラル表記を持ちません。必要なら、それを参照する変数を宣言したり、メッセージ式を記述して、そのオブジェクトを参照します。たとえば、獲得したメタクラスを任意の変数で束縛しておくと、これをいつでも好きなときに参照できます。

metaclass := SmallInteger class

◆ まとめると、オブジェクトを(直接間接を問わず)参照するには、3つの方法
 (1) リテラル (2) 変数 (3) メッセージ式
があります。

【Tips】リテラル、変数、メッセージ式

3 + 4 factorial

60519c ◆ メッセージ式 3 + 4 factorial を見ると、表面的には、2つのオブジェクト 3 および 4 が存在するだけです。しかし、この式を評価する過程において、オブジェクト 24 および 27 が生成されていることが分ります。オブジェクト 24 は、引数として、メッセージ +24 を形成します。オブジェクト 27 は、リターンとして、メッセージ式 3 + 24 を評価したときに得られます。ただし、これらのオブジェクトは、式を評価した後では、これらを直接的に参照する方法がありません。

a := 4 factorial
b := 3 + a

◆ そのため、変数を使って間接的に参照するか、再びメッセージ式を評価して、そのリターンを間接的に参照するしか術がありません。

60519a ◆ オブジェクト 6 を表現するには、3つの方法があります。まず、リテラルを使って、直接的に 6 と表記することです。次に、変数 n を使って、間接的に参照することです。最後に、メッセージ式 3 factorial を使って、そのリターンを間接的に参照することです。どの方法を使っても、同じ整数オブジェクト 6 を参照できます。

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

|

« 連載: Smalltalk use: better《9》基本要素の意義:変数とは★ | トップページ | 連載: Smalltalk use: better《11》はやくオブジェクトになりたいっ »

Squeak/Smalltalk」カテゴリの記事

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

コメント

コメントを書く



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




トラックバック


この記事へのトラックバック一覧です: 連載: Smalltalk use: better《10》基本要素の意義:式とは★:

« 連載: Smalltalk use: better《9》基本要素の意義:変数とは★ | トップページ | 連載: Smalltalk use: better《11》はやくオブジェクトになりたいっ »