GO BACK

Squeak教室 上級編その1

「Smalltalkを使ってみる」



■Smalltalkはどうなってる?

 さて、ここでは「SqueakはSmalltalkである」ということで、Squeakを使ってSmalltalkという言語を使ってみることにします。Squeakでは、今までSqueak・トーイと呼ばれる部品にパネルを使ってスクリプトを書いてきました。が、これは「Smalltalkのプログラム」ではありません。これはSqueakのために構築された環境であり、Smalltalkとは直接関係ないものなのです。

 では、Smalltalkのプログラムというのはどんなものか。一番簡単にそれを見られるのは、「ボタン」のスクリプトでしょう。——とりあえず、デスクトップに「ボタン」を1つ配置して下さい。そしてハロを表示し、下辺のやや右辺りにある淡いグリーンのハロをクリックします。すると、スクリプトを表示するパネルが現れます。


 が、なんか今までのスクリプト・パネルとは様子が違いますね。「self」なんて、いかにもプログラミング言語の予約後っぽいものが書かれています。そう、これはパネル・スクリプトで実行される「生のSmalltalkプログラム」が見えているのです。

 実はこれ、普通のスクリプト・パネルでも簡単に見られます。「!」マークの隣の◎マークの更に隣にある四角いマークをクリックしてみましょう。上の表示が、ごく普通のスクリプト・パネルの表示に戻っちゃいます。このマークをクリックすることで、「パネルのスクリプト」と「Smalltalkのプログラム」を切り替え表示できるようになっていたのです。

 これを使えば、Smalltalkのプログラムがどんなものか、とりあえず覗いてみることはできます。とりあえず、適当に部品を操作するパネルを入れて、切り替え表示してみましょう。どんなことが裏側で実行されているのか見えて、なかなか面白いですよ。


 例えば、これは楕円を使ってペンをいろいろ操作してみたスクリプトです。何やら「self ○○」といった文がずらっと並んでますね。こんな具合にして、Smalltalkのプログラムが作成されていたんですね。


■Smalltalkの文法は?

 しかし、このプログラム、わかるようなわからないようななんともいえない文です。とりあえず、基本的な文法ぐらいは覚えておかないと先へ進めないですね。というわけで、とりあえず簡単にSmalltalkについて覚えておきたいことをまとめてみましょう。

1.Smalltalkはオブジェクト指向言語である。
最近、よく耳にしますね。「オブジェクト指向」って。要するにオブジェクトとかいう代物の形でプログラムができてるってやつですね。このオブジェクト指向、実はSmalltalkによって誕生した、といってもいいようなもんです(・・ほんとはそうでもないけど、ま、広めたのはSmalltalkの力っていっていいかも)。最初から「すべてをオブジェクトとして扱う」ということを考えて作られたのがSmalltalkなのです。

2.Smalltalkでは、すべてのものはオブジェクトである。
Smalltalkという言語では、すべてのものは「オブジェクト」として扱われます。オブジェクトっていうのは何か? これは、「それ自身の中に、それを扱うのに必要な全てが入っているもの」という感じのものです。例えば、普通の変数とかそういうのだと一つの値しか扱えないですね。そうじゃなくて、必要な値も、それを操作する機能も、すべて1つにまとまっている、って感じのものです。

3.オブジェクトは、クラスから作られる。
Smalltalkでは、プログラムで扱われる様々な要素は「クラス」と呼ばれる形で定義されます。これは、一種の設計図みたいなものです。このクラスを元に「インスタンス」と呼ばれるオブジェクトが作られ、それを使っていろいろプログラムを動かしたりするわけです。例えば、ボタンを作って使いたいと思えば、ボタンのクラスからインスタンスを作り、そのインスタンスの中の機能を呼び出したりして操作する、というわけです。

4.クラスの中には変数と「メソッド」がある。
クラスは、その中に必要な値や機能がまとめられています。値は変数としておさめてありますし、機能は「メソッド」と呼ばれる小さなプログラムとして入ってます。ある機能を利用したければ、そのオブジェクトに向けて「このメソッドを呼び出して下さい」というようにお願いするわけです。

5.メソッドの呼び出しは、「メッセージ」を送って行う。
では、メソッドの呼び出しはどうやって実行するか? それは、「メッセージ」と呼ばれるもので行ないます。あるオブジェクトにメッセージを送ると、そのメッセージに対応するメソッドが呼び出され実行される、というようになっているわけです。——Smalltalkという環境は、無数のオブジェクト間でさまざまなメッセージを送りあいながら動いている、と考えて良いでしょう。

6.メッセージは、オブジェクトの後にセレクタやキーワードが続いた形をしている。
メッセージは、受け取るオブジェクト(レシーバといいます)の後に、メッセージの種類を識別する様々な要素を記述します。これは大別して「単項/二項式」と「キーワード式」というものになります。キーワードとかセレクタとかなんか難しそうですが、要するに「普通の言語の命令とかに相当するものなんだ」と考えておけば今は十分です。

・単項式: レシーバ セレクタ
(例) 90 sin (90というオブジェクトにsinというメッセージを送る)

二項式: レシーバ セレクタ 引数
(例) 5 + 7 (5というオブジェクトに+ 7というメッセージを送る)

・キーワード式: レシーバ キーワード:引数
(例) myobject go:100 (myobjectというオブジェクトにgo:100メッセージを送る)

7.制御構文に相当するものでは、[]を使ってまとめる。
繰り返しや条件分岐に相当する文などでは、[]という記号を使い、その中に実行するメッセージを書くことがあります。この[]でくくったものは「ブロック」と呼ばれます。これは遅延評価とかいう難しそうなことをするもんですが、まぁ後で構文(?)を使うようになったら覚えればいいでしょう。今は「そういうもんがある」ってことで。

8.各文は、ピリオドで区切って書く。
ある程度のプログラムともなればいくつもの文を続けて書くことになりますが、こうした場合、文と文の間にピリオドを入れて、「ここが文の切れ目です」ということを示さないといけません。ピリオドを入れておけば、改行などしなくとも別の文と認識します。が、入れないと、たとえ改行してあっても「ここで文が切れている」と認識してくれないので注意して下さい。

9.Smalltalkでは、大文字と小文字は「別の文字」。
これも最初に覚えておきましょう。Smalltalkでは、大文字と小文字は別の文字です。「a」と「A」は違うものだし、「true」と「True」も別のものになります。これは、けっこう引っかかることが多いので忘れないように!

10.「A」と「A:」は「別のもの」。
これもよく引っかかります。SmalltalkではAというように一つの単語のものと、「A:」というように後ろに:記号がついたものがよく出てきますが、これらは全く違うものです。うっかり:をつけ忘れたりすると動かないので注意!

 とりあえず、簡単なプログラムを書いて動かすのに必要な最小限の知識はこんなところでしょうか。これでも、重要な要素をかなりざっくり削ってあるんですけど、まあ最初から何でも暗記できるわけはないので、こんなところで十分でしょう。


■簡単な文を実行させる

 では、実際にSmalltalkのプログラムを実行させてみましょう。先ほどやったように、「ボタン」部品のスクリプトを表示して、その中で実行させてみます。

 開いたスクリプトにある「self」というのを消して、「3 + 5」と書き込んでみましょう。そして、書き込んだ式の部分をマウスで選択し、右側にあるスクロールバーの上部に見える「−」マークの部分をマウスでプレスします。するとメニューが現れるので、ここから「式を評価して表示」を選んで下さい。すると、選択部分の後に、「8」と計算結果が表示されます。メニューは、escキーを押しても現れます。



 これはどういうことをやっているかというと、「選択した部分を、Smalltalkの式として評価(つまり実行)し、その結果を表示する」ということをやったわけです。

 Smalltalkというのは、普通のプログラミング言語のように「専用のエディタでプログラムを入力し、コンパイルなりRunなりして実行する」という感じのものではありません。前にもいいましたが、Smalltalkは「環境そのもの」なのです。いつでもどこでも、式を書いて評価すればその場でプログラムは動きます。プログラムを書くための専用の場所があるわけではありません。「え、でもスクリプト・パネルの中に書かないと駄目なんでしょ?」と思った人。実は、違います。これを使ったのは、とりあえず手っ取り早くテキストを書ける場所だからです(笑)。それに、さっきボタン作ったし。はっはっは。

 どんな場所でも、テキストを選択して評価すれば、その場でプログラムは動く。それがSmalltalkです。このことは忘れないでおきましょう。

 さて、今の「3 + 5」っていうのは、「3と5を足す式」ではありません。これは、「3というオブジェクトに、『+5』メッセージを送る」というものなのです。「同じだろ?」と思った人。実は、違います。何が違うかといえば、「+には加算するという意味などない」からです。初期状態で、+に「引数の値を加算する」という働きが定義されていたから足し算ができただけで、+の定義を変更すれば、足し算でなくかけ算をするかも知れません。

 「そんなこといってたら、まともに足し算もできないじゃん」と思うかも知れませんが、まぁそうです。Smalltalkでは、「言語に最初から用意されていて変更不可の予約語を組み合わせて文を作る」というわけではありません。足し算もかけ算も、すべて「そういう働きを定義されたメッセージを送っている」だけなのです。それがイヤならいつでもユーザーが望む形に再定義できる。「こういう仕様だからそれでやってね」というのでなく、「すべての要素はユーザーに解放されていて好きに変更できる」のですよ。——ただ、だからといって+などを勝手に変えてしまうと、あちこちで不具合が出ますから、たいていは最初から用意されているものは変更しませんが。

 また、上の説明でわかるように、数字も「オブジェクト」です。もちろん、テキストも、キャラクタも、すべてオブジェクトとして扱われるのです。このへんも、慣れないと気持ち悪い感じがすることでしょう。が、慣れてしまうと、とってもすっきりしてわかりやすいですよ。



■変数と条件分岐(に相当するもの)

 では、もうちょっと難しい文を書いてみましょう。こんな感じでスクリプトを記入し、書いた部分を全て選択してから「式を評価して表示」メニューで実行してみて下さい。

|a b|
a _ 7.
a \\ 2 = 0
    ifTrue:[b _ '偶数']
    ifFalse:[b _ '奇数'].
^ b



 えーと、いくつか捕足しておくことがあります。まず、¥記号ですが、これはSmalltalkではバックスラッシュ(\)記号になります。それからアンダースコア(_)と^記号は、それぞれ「←」「↑」記号に変わります。これらは、Smalltalkのお約束と思って下さい。図とよく照らし合わせれば、これらの記号が置き換わっていることがよくわかりますね。

 これは、aの値をチェックして偶数か奇数かを表示するものです。ここでは変数と、条件分岐(と普通の言語ではいわれるだろうメッセージの使い方)を使っています。ポイントをざっと整理しましょう。

1.変数は、最初に||記号の間に書いておく。
Smalltalkでは、変数は最初に|a|というようにして|記号で挟んで書いておきます。もし複数必要ならば、それらは半角スペースを空けて続けて書きます。

2.Smalltalkでは、変数には「型」がない(?)。
見ればわかりますが、Smalltalkの変数は「どんな値を入れるものか」という型(タイプ)の指定がありません(ってゆーか全部「オブジェクト型」なんで、まぁ「ない」って思っていいかも)。内部的には値に型はありますが、変数を使う際にそれらを指定することはありません。

3.数字はそのまま。テキストはシングルクオートで。
Smalltalkで数字を扱うときは、そのまま数字を書けばいいです。またテキストの場合は、前後をシングルクォートでくくり、'Abc' というように書きます。

4.四則演算用の二項式はいろいろある。
四則演算に相当する二項式のセレクタは「+」「−」「*」「/」「//」「\\」といったものがあります。最初の4つはわかりますね? それぞれ加算・減算・乗算・除算のものです。その後は、わり算の整数値を得るものと、余りを得るものです。とりあえずこれらは計算の基本なので覚えておきましょう。

5.条件分岐は、ない。けど相当するメッセージはある。
前に触れたように、Smalltalkは予約語を記述してあれこれするもんじゃありません。従って、条件分岐なんて構文もありません。じゃあどうするかというと、「オブジェクトがtrueのときに引数のオブジェクトを評価するメッセージ」「オブジェクトがfalseのときに引数を評価するメッセージ」というものがあるのですよ。それが「ifTrue:」「ifFalse:」というキーワード式です。

6.ifTrue: と ifFalse: の式の書き方を覚えておこう!
では、この条件分岐のように機能するキーワード式の書き方を覚えておきましょう。これは、以下のよう中たちで記述します。ifTrue/ifFalse単体でも使えますし、両者が逆になっていても受け付けてくれます。
真偽値のオブジェクト ifTrue: 実行ブロック ifFalse: 実行ブロック
 実行ブロックの部分は、前にいった[]記号の中に実行するメッセージを順番に書いておけばいいわけですね。それから真義値のオブジェクトってのは、「真義値の値が得られるもの」と考えておけばいいでしょう。例えばさっきの例のように「○○=××」というようなものがくるわけです。

 というわけで、だいぶ長くなってきたので今回はこの辺で。とりあえず、これだけでもそこそこなプログラムは書けると思うので、いろいろと試して、Smalltalkという言語体系に慣れておきましょう。


GO NEXT


GO HOME