« 連載: Smalltalk use: better《5》3つの基本要素:式★ | トップページ | 連載: Smalltalk use: better《7》プロッククロージャー★ »

2006年5月15日 (月)

連載: Smalltalk use: better《6》万能メソッド★

キーワード ◆ perform:・perform:with:・perform:with:with:・perform:with:with:with:・オブジェクト・シンボル・セレクター・メッセージ・メッセージ式・引数・演算子・関数名・文字列・万能メソッド

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

【目次】
Smalltalk use: better

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

クリスマスプレゼントに金槌をもらった子どもは、
何でも叩きたがる。

Gerald M. Weinberg

◆ 今週も、先週に続いて、Smalltalk で記述されたコードの断片を示しながら、その背景にある文化や思想を理解するための、予備知識の習得を目指します。また、この連載は、プログラミング技法の習得が主たる目的ではありません。むしろ、そちらの話題に興味があるみなさんは、参考文献をお楽しみください。説明の都合(話の展開)から、Smalltalk の構文やその要素について、解説を続けます。何事も基本が大切です。もうしばらくのご辛抱を…。m(_o_)m

◆ 万能メソッドは、さまざまな場面で利用できます。玩具のピコピコトンカチと同様に、実害はないので、何でも叩いて(試して)みるにはピッタリの存在です。

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

万能メソッド ◆ さまざまな場面で利用できる、汎用性の高い「万能」メソッドを紹介します。

3 perform: #factorial          "6"

60515a_2

 

◆ 式 3 perform: #factorial を評価すると、6 が得られます。このとき、オブジェクト 3 は、メッセージ perform: #factorial を受取ると、引数に指定された factorial をセレクターとして、自身にメッセージを転送します。つまり、式 3 factorial を評価するのと、同じ結果が得られます。このように、セレクターと、関数名および演算子とは、似て非なるものであることが分ります。

| selector |
selector := #negated.
3 perform: selector.          "-3"
selector := #factorial.
3 perform: selector          "6"

60515b_2

シンボル ◆ # で始まるリテラルは、特殊な文字列でシンボルと呼ばれます。

'abc' == 'abc' copy          "false"
#abc == #abc copy          "true"

◆ 文字列は、同じ内容を持つインスタンスが多数存在しますが、シンボルは、唯一無二の存在であることが分ります。perform: などは、メソッド辞書の中から、これらのシンボルをキーとしてメソッドの実体(コンパイル済みのメソッド)を参照します。そのため、文字列とは別に、キーが重複しないことを保証できるシンボルを必要とするのです。

セレクター ◆ 一般に、メッセージ式は、1つのセレクターと複数の引数によって構成されます。メッセージ式を構成する factorial や lcm: などのセレクターは、特殊な文字列(シンボル)であり、メソッドを起動するためのトリガーとして働きます。+ も同様です。これは、演算子とは似て非なるものです。単なる文字列(シンボル)にすぎません。

3 perform: #+ with: 4          "7"

60515c_2

◆ 式 3 perform: #+ with: 4 を評価すると、7 が得られます。このとき、オブジェクト 3 は、メッセージ perform: #+ with: 4 を受取ると、引数に指定された + をセレクター、4 を引数として、自身にメッセージを転送します。つまり、式 3 + 4 を評価するのと、同じ結果が得られます。

3 perform: #lcm: with: 4          "12"

60515d_1

 

◆ 式 3 perform: #lcm: with: 4 を評価すると、4 が得られます。このとき、オブジェクト 3 は、メッセージ perform: #lcm: with: 4 を受取ると、引数に指定された lcm: をセレクター、4 を引数として、自身にメッセージを転送します。つまり、式 3 lcm: 4 を評価するのと、同じ結果が得られます。

◆ このように「演算子とは似て非なるもの」ということが理解できると、次のような記述も可能であることが分ります。

#(+ - * /) collect: [:op |
    3 perform: op with: 4]          "#(7 -1 12 (3/4))"

これは、2つの数 3 と 4 との、和差積商を求めるものです。詳細は、今後の連載で明らかにします。

【課題】次の式を評価すると、それぞれに何が得られますか。

3 perform: #perform: with: #factorial
3 perform: #perform:with: with: #+ with: 4
3 perform: #perform:with:with: with: #between:and: with: 2 with: 4

また、その理由を説明してください。

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

|

« 連載: Smalltalk use: better《5》3つの基本要素:式★ | トップページ | 連載: Smalltalk use: better《7》プロッククロージャー★ »

Squeak/Smalltalk」カテゴリの記事

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

コメント

コメントを書く



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




トラックバック


この記事へのトラックバック一覧です: 連載: Smalltalk use: better《6》万能メソッド★:

« 連載: Smalltalk use: better《5》3つの基本要素:式★ | トップページ | 連載: Smalltalk use: better《7》プロッククロージャー★ »