もっと楽しむ! プログラミング言語 「豆」談義

第5回 おしゃべり程度のプログラミング「Smalltalk」(前編)

この記事を読むのに必要な時間:およそ 3 分

ブロックの使い方

次にブロックを見ていきます。ブロックとは後から実行可能な命令の固まりです。以下のソースを見てください。

block ← [3 + 4].
block value.

[・・・]を使用するとブロックを作成できます。ブロックもちゃんとしたオブジェクトでBlockContextクラスのインスタンスです。ブロックを作成しただけだと,ブロック内の命令は実行されません。ブロックにvalueメッセージを送ると,ブロック内の命令を実行します。今回の場合,結果は7になります。ブロックには引数を渡すことも可能です。以下のソースを見てください。

block ← [:arg1 :arg2 | arg1 + arg2].
block value: 3 value: 4.

先ほどと同じことを,引数を使用したブロックで行っています。ブロック内の|より前の部分で,受け取る引数を記述します。ブロックの実行は,value:メッセージで引数を指定します。

ブロックを使用することで,Smalltalkは条件分岐や繰り返し処理もオブジェクトとメッセージで実現します。以下のソースを見てください。

num ← 2.
num even ifTrue: ['偶数'] ifFalse: ['奇数'].

array ← #(1 2 3 4 5).
sum ← 0.
1 to: 5 do: [:index | sum ← sum + (array at:index)].

num変数にevenメッセージを送ると,偶数かどうかを判定し,trueまたはfalseのオブジェクトを返します。trueのオブジェクトはifTrue:メッセージ,falseのオブジェクトはifFalse:メッセージで指定されたブロックにvalueメッセージを送ります。今回の場合,結果は'偶数'になります。繰り返し処理は,数値のオブジェクトにto:do:メッセージを送ることで行います。今回の場合,do:メッセージで指定されたブロックに対してvalue:1~value:5のメッセージが送られ,sum変数は15になります。

便利なブロック

ブロックは,Arrayクラスなど,コレクションを走査するためのメッセージでとても上手に利用されています。先ほどのto:do:メッセージによる繰り返し処理は,Javaのfor文に似たような動作をしていて,配列から要素を取り出す記述が必要でしたが,配列のオブジェクトにdo:メッセージを送ると配列から要素を取り出す記述を省くことができます。以下のソースを見てください。

array ← #(1 2 3 4 5).
sum ← 0.
array do: [:each | sum ← sum + each].

Smalltalkではこのように配列のオブジェクトにdo:メッセージを送り,配列の要素に順にアクセスすることができます。さらにもう1つ例を見てみましょう。

array ← #(1 2 3 4 5).
sum ← 0.
(array select: [:each | each even]) do: [:each | sum ← sum + each].

select:メッセージは指定されたブロックがtrueを返す要素だけを含む配列のオブジェクトを返します。この例では先ほどのdo:メッセージと組み合わせ,配列から偶数の要素のみを足し合わせた合計を計算していて,sum変数は6になります。ブロックの存在により,とてもシンプルに記述できていますね。

前編はSmalltalkの登場背景と特徴的な構文を紹介しました。Smalltalkはオブジェクトへのメッセージ送信が徹底されているため,日頃Javaを使用している人には新鮮に感じられると思います。後編はSmalltalkの大きな特徴の1つであるプログラミング環境についてお話します。

参考文献
[1]『未来をつくった人々 ゼロックス・パロアルト研究所とコンピュータエイジの黎明』Michael Hiltzik 毎日コミュニケーションズ ISBN4-8399-0225-9
[2]『アラン・ケイ』Alan Curtis Kay 株式会社アスキー ISBN4-7561-0107-0
[3]『Squeak入門 過去から来た未来のプログラミング環境』Mark J. Guzdial & Kimberly M. Rose 株式会社エスアイビー・アクセス ISBN4-434-02947-9
[4]『自由自在Squeakプログラミング』梅沢真史 株式会社ソフト・リサーチ・センター ISBN4-88373-203-7

著者プロフィール

チーム北海道

居酒屋北海道をこよなく愛するエンジニア集団(伊藤清人,江川崇,荻原利雄,長谷川裕一,吉野雅人 以上株式会社豆蔵所属)。

URLhttp://www.mamezou.com/