こんにちは。今週は 核心に入っていきます。
構文です。
このクラスは Pharo の構文での メッセージを主に扱います。
それが Pharo の大部分なのです。
Pharo には主なものが3つあります。
オブジェクトとメッセージと ブロックと呼ばれるクロージャです。
ブロックについてのコースは 別にあるでしょう。
これで Pharo の全構文の ほとんどがカバーできます。
Pharo の構文は Smalltalk から来ていますが
それは子ども達にプログラムの仕方を 教えるために設計されました。
子ども達が書くような短い文のように
プログラムを書きます。
括弧の数をできるだけ少なく 済ますことにもなります。
どのようなものかお見せしましょう。
例えば openstreetmapのタイルを取り出して
それをグラフィカルに ウィンドウで開きたいと思います。
これは構文の例です。
まず最初に PNG ファイルが欲しいので 括弧を使います。
PNG ファイルを Pharo の グラフィックオブジェクトに変換します。
そしてウィンドウの中に開きます。 Pharo で実行して結果をみましょう。
それはたぶん水でしょう。 水のタイルは沢山ありますから。
Pharo の構文では 3種類のメッセージがあることで
括弧の数を最小限にしています。
単項(unary)、二項(binary) そしてキーワードメッセージです。
では見てみましょう。
単項メッセージでは 1つのレシーバーに続いてメソッド名がきます。
二項メッセージでは 1つのレシーバー、セレクター、そして引数です。
キーワードメッセージでは 1つのレシーバー、1つまたは複数の引数がきます。
:(コロン)があるので区別することができます。
これを勉強しましょう。
これら3種類のメッセージを どのように使うのでしょうか？
それらを使い分けることができます。
プログラムが実行される方法が変わります。
まずは括弧でくくられたものが 常に先に実行されます。
続いて単項メッセージ、二項メッセージ そしてキーワードメッセージの順です。
同じレベルのメッセージは
左から右の順に実行されます。
では単項メッセージを見てみましょう。
小さな整数1にクラスを尋ねたら SmallInteger が返ってきます。
これが翌週の宿題です。
もし真偽値 false に not メッセージを送ったら 真偽値 true が得られます。
Date クラスに今日の日付を問い合わせれば
例えば「24 May 2009」のような 日付(Date)オブジェクトが返ってきます。
Float クラスに pi メッセージを送れば
円周率(pi)を表すオブジェクトが返ってきます。
お気付きでしょうか
オブジェクトにメッセージを送るのと
全く同じ方法でクラスにも メッセージを送ります。
「これはクラスだから注意しなくては。 何々をしなければいけない」なんて言いません。
私は整数に class メッセージを送り 整数はそのクラスを返してきます。
私はDateクラスにtodayメッセージを送り Dateクラスは日付を返します。
当然のことです。
Pharo では クラスはオブジェクトでもあるのです。
クラスに送られたメッセージは インスタンスに送られたのと同じように処理されます。
納得できることです。
ここで1つ例題があります。
この演習は構文とは関係ありません。 ちょっとした余興です。
Pointクラスに実装された全てのメソッドが
分かったら面白いと思いませんか？ 単項メッセージでできます。
「Pointクラスさん、あなたの全メソッドと 理解可能な全メッセージ名を返してください」
すると全メッセージの長いリストが 返ってきます。
ツールを作るのがどんなに簡単か お分かりでしょうか？
これをリストに入れれば
クラスが答える全メッセージのリストが できます。
これが、あなたが使っているブラウザが 動いている仕組みです。
ちょっと改良してみましょう。
Pointクラスの全ての単項メッセージを システムに問い合わせてみます。
こんな風に書けます。「Point クラスさん あなたの全セレクタをリストしてください。」
配列が返ってきます。
書いているのは 私はselect(選択する)したい
これはキーワードメッセージですね。
私はこれらのセレクタの中から 単項なものを選択(select)したい。
#isUnary という問い合わせがあります。
これはメソッド名に関するメッセージで 単項(unary)のものを選びます。
これはちょっと補足ですが
select:についてはイテレーターに関するコースで 学ぶことになります。
とてもエレガントです。 システムへの問い合わせを1行で書けるのです。
ではテーマに戻りましょう。
二項メッセージです。 二項メッセージはオブジェクトと
二項セレクタ、引数で構成されます。
二項セレクタは記号の組み合わせです。
「%」や「|」など
記号的なものは二項です。 算数のようなものは二項です。
例えば、オブジェクト「1」に 「+」メッセージを
オブジェクト「2」を引数にすると 3が返ってきます。良いですね。
「>」は二項メッセージです。
「@」も二項メッセージです。 (点オブジェクトを生成します).
文字列の連結する「,」は 二項メッセージです。
「'Black chocolate',' is good'」 と書くと
「'Black chocolate is good'」 という文字列が返ってきます。その通りですね。
キーワードメッセージについてですが…
ピリオドや括弧やコンマを使った
JavaやCのような構文に慣れている皆さんには
フラストレーションになるようですが
こんな風に:を間に挟みます。
この例で見ていただきたいのは
メッセージはkayword1keyword2だということです。
これで完結したメッセージです。 2つの部分から構成されています。
ではテストの時間です。 数秒ずつで答えてください。
これらのメッセージは何でしょうか？ それぞれ何という種類のメッセージでしょうか？
1つ目のものは引数がありません。 これは単項メッセージです。
2つ目も同じです。
コロンがあります。 キーワードメッセージです。
よくわからないコンマがあって何かしています。 二項です。
変ですね。二項です。 引数がありません。単項です。
コロンがあります。キーワードです。
難しいように見えるかもしれませんが
これが解答です。
例えば
点のx値を変えたいとします。
これは点です。二項メッセージです。
setX: と引数を書きます。
これでx値が2に変わった点が返ってきます。
それほど難しくないですよね？
次に at:put: メッセージです。 配列があります。
配列には文字列が格納されています。 'Calvin' 'hates' 'Suzie'です。
2つ目の要素を変更します。
「at: 2 put: 'loves'」と書きます。
これが2番目の要素です。 なので、'loves'がここに来ます。
配列について このメソッドは
at:put: と呼ばれています。
このメソッドは集合の 与えられた添字の値を変更します。
お分かりのように Pharoでは添字は1から始まります。0ではなく。
2番目の要素が欲しいので 1、2と数えるのです。
引き算したりする必要はありません。
キーワードメッセージの例が もう1つあります。
12が (12は整数です)
10と20の間かどうか訊きます。
between:and: メッセージです。
構文的には
12.betweenAnd(10,20). と同じです。
これについては もう良いでしょう。
メッセージには3種類あります。
単項、二項、そしてキーワードです。
以上です。