1 00:00:07,040 --> 00:00:10,440 こんにちは。今週は 核心に入っていきます。 2 00:00:10,600 --> 00:00:12,160 構文です。 3 00:00:12,320 --> 00:00:17,560 このクラスは Pharo の構文での メッセージを主に扱います。 4 00:00:17,720 --> 00:00:19,560 それが Pharo の大部分なのです。 5 00:00:20,400 --> 00:00:23,840 Pharo には主なものが3つあります。 6 00:00:24,000 --> 00:00:28,040 オブジェクトとメッセージと ブロックと呼ばれるクロージャです。 7 00:00:28,200 --> 00:00:30,200 ブロックについてのコースは 別にあるでしょう。 8 00:00:30,360 --> 00:00:33,640 これで Pharo の全構文の ほとんどがカバーできます。 9 00:00:33,800 --> 00:00:37,360 Pharo の構文は Smalltalk から来ていますが 10 00:00:37,520 --> 00:00:40,760 それは子ども達にプログラムの仕方を 教えるために設計されました。 11 00:00:40,920 --> 00:00:44,400 子ども達が書くような短い文のように 12 00:00:44,560 --> 00:00:46,040 プログラムを書きます。 13 00:00:46,200 --> 00:00:49,320 括弧の数をできるだけ少なく 済ますことにもなります。 14 00:00:49,480 --> 00:00:50,960 どのようなものかお見せしましょう。 15 00:00:52,040 --> 00:00:56,320 例えば openstreetmapのタイルを取り出して 16 00:00:56,480 --> 00:00:59,520 それをグラフィカルに ウィンドウで開きたいと思います。 17 00:00:59,680 --> 00:01:02,400 これは構文の例です。 18 00:01:02,560 --> 00:01:06,000 まず最初に PNG ファイルが欲しいので 括弧を使います。 19 00:01:06,160 --> 00:01:09,520 PNG ファイルを Pharo の グラフィックオブジェクトに変換します。 20 00:01:09,680 --> 00:01:14,920 そしてウィンドウの中に開きます。 Pharo で実行して結果をみましょう。 21 00:01:15,080 --> 00:01:18,200 それはたぶん水でしょう。 水のタイルは沢山ありますから。 22 00:01:19,120 --> 00:01:23,040 Pharo の構文では 3種類のメッセージがあることで 23 00:01:23,200 --> 00:01:26,240 括弧の数を最小限にしています。 24 00:01:26,400 --> 00:01:30,480 単項(unary)、二項(binary) そしてキーワードメッセージです。 25 00:01:30,640 --> 00:01:31,880 では見てみましょう。 26 00:01:32,520 --> 00:01:37,040 単項メッセージでは 1つのレシーバーに続いてメソッド名がきます。 27 00:01:37,200 --> 00:01:41,600 二項メッセージでは 1つのレシーバー、セレクター、そして引数です。 28 00:01:41,760 --> 00:01:46,880 キーワードメッセージでは 1つのレシーバー、1つまたは複数の引数がきます。 29 00:01:47,040 --> 00:01:51,000 :(コロン)があるので区別することができます。 30 00:01:51,160 --> 00:01:52,560 これを勉強しましょう。 31 00:01:53,560 --> 00:01:57,960 これら3種類のメッセージを どのように使うのでしょうか? 32 00:01:58,120 --> 00:01:59,840 それらを使い分けることができます。 33 00:02:00,000 --> 00:02:02,480 プログラムが実行される方法が変わります。 34 00:02:02,640 --> 00:02:06,800 まずは括弧でくくられたものが 常に先に実行されます。 35 00:02:06,960 --> 00:02:09,880 続いて単項メッセージ、二項メッセージ そしてキーワードメッセージの順です。 36 00:02:10,040 --> 00:02:13,760 同じレベルのメッセージは 37 00:02:13,920 --> 00:02:15,480 左から右の順に実行されます。 38 00:02:17,640 --> 00:02:20,800 では単項メッセージを見てみましょう。 39 00:02:20,960 --> 00:02:25,000 小さな整数1にクラスを尋ねたら SmallInteger が返ってきます。 40 00:02:25,680 --> 00:02:29,040 これが翌週の宿題です。 41 00:02:29,200 --> 00:02:33,160 もし真偽値 false に not メッセージを送ったら 真偽値 true が得られます。 42 00:02:33,720 --> 00:02:36,520 Date クラスに今日の日付を問い合わせれば 43 00:02:36,680 --> 00:02:40,480 例えば「24 May 2009」のような 日付(Date)オブジェクトが返ってきます。 44 00:02:40,640 --> 00:02:43,320 Float クラスに pi メッセージを送れば 45 00:02:43,480 --> 00:02:46,240 円周率(pi)を表すオブジェクトが返ってきます。 46 00:02:47,640 --> 00:02:49,720 お気付きでしょうか 47 00:02:49,880 --> 00:02:54,040 オブジェクトにメッセージを送るのと 48 00:02:54,200 --> 00:02:57,520 全く同じ方法でクラスにも メッセージを送ります。 49 00:02:57,680 --> 00:03:01,680 「これはクラスだから注意しなくては。 何々をしなければいけない」なんて言いません。 50 00:03:01,840 --> 00:03:06,560 私は整数に class メッセージを送り 整数はそのクラスを返してきます。 51 00:03:06,720 --> 00:03:10,880 私はDateクラスにtodayメッセージを送り Dateクラスは日付を返します。 52 00:03:11,040 --> 00:03:12,240 当然のことです。 53 00:03:12,400 --> 00:03:14,760 Pharo では クラスはオブジェクトでもあるのです。 54 00:03:14,920 --> 00:03:19,400 クラスに送られたメッセージは インスタンスに送られたのと同じように処理されます。 55 00:03:19,560 --> 00:03:21,320 納得できることです。 56 00:03:22,600 --> 00:03:24,360 ここで1つ例題があります。 57 00:03:24,520 --> 00:03:28,000 この演習は構文とは関係ありません。 ちょっとした余興です。 58 00:03:28,720 --> 00:03:32,760 Pointクラスに実装された全てのメソッドが 59 00:03:34,040 --> 00:03:37,640 分かったら面白いと思いませんか? 単項メッセージでできます。 60 00:03:37,800 --> 00:03:42,280 「Pointクラスさん、あなたの全メソッドと 理解可能な全メッセージ名を返してください」 61 00:03:42,440 --> 00:03:45,240 すると全メッセージの長いリストが 返ってきます。 62 00:03:45,880 --> 00:03:48,560 ツールを作るのがどんなに簡単か お分かりでしょうか? 63 00:03:48,720 --> 00:03:50,840 これをリストに入れれば 64 00:03:51,400 --> 00:03:54,920 クラスが答える全メッセージのリストが できます。 65 00:03:55,080 --> 00:03:57,400 これが、あなたが使っているブラウザが 動いている仕組みです。 66 00:03:57,960 --> 00:04:02,160 ちょっと改良してみましょう。 67 00:04:02,320 --> 00:04:05,520 Pointクラスの全ての単項メッセージを システムに問い合わせてみます。 68 00:04:05,680 --> 00:04:09,240 こんな風に書けます。「Point クラスさん あなたの全セレクタをリストしてください。」 69 00:04:09,400 --> 00:04:12,560 配列が返ってきます。 70 00:04:12,720 --> 00:04:15,120 書いているのは 私はselect(選択する)したい 71 00:04:15,960 --> 00:04:18,080 これはキーワードメッセージですね。 72 00:04:18,240 --> 00:04:21,960 私はこれらのセレクタの中から 単項なものを選択(select)したい。 73 00:04:22,120 --> 00:04:24,560 #isUnary という問い合わせがあります。 74 00:04:24,720 --> 00:04:28,800 これはメソッド名に関するメッセージで 単項(unary)のものを選びます。 75 00:04:28,960 --> 00:04:33,280 これはちょっと補足ですが 76 00:04:33,440 --> 00:04:37,520 select:についてはイテレーターに関するコースで 学ぶことになります。 77 00:04:37,680 --> 00:04:40,920 とてもエレガントです。 システムへの問い合わせを1行で書けるのです。 78 00:04:41,800 --> 00:04:43,480 ではテーマに戻りましょう。 79 00:04:44,160 --> 00:04:48,120 二項メッセージです。 二項メッセージはオブジェクトと 80 00:04:48,280 --> 00:04:50,280 二項セレクタ、引数で構成されます。 81 00:04:50,440 --> 00:04:55,560 二項セレクタは記号の組み合わせです。 82 00:04:55,720 --> 00:04:57,240 「%」や「|」など 83 00:04:58,120 --> 00:05:02,960 記号的なものは二項です。 算数のようなものは二項です。 84 00:05:03,880 --> 00:05:06,800 例えば、オブジェクト「1」に 「+」メッセージを 85 00:05:06,960 --> 00:05:10,520 オブジェクト「2」を引数にすると 3が返ってきます。良いですね。 86 00:05:10,680 --> 00:05:14,080 「>」は二項メッセージです。 87 00:05:14,240 --> 00:05:17,880 「@」も二項メッセージです。 (点オブジェクトを生成します). 88 00:05:18,040 --> 00:05:21,200 文字列の連結する「,」は 二項メッセージです。 89 00:05:21,360 --> 00:05:23,760 「'Black chocolate',' is good'」 と書くと 90 00:05:23,920 --> 00:05:27,360 「'Black chocolate is good'」 という文字列が返ってきます。その通りですね。 91 00:05:27,520 --> 00:05:30,480 キーワードメッセージについてですが… 92 00:05:30,640 --> 00:05:33,520 ピリオドや括弧やコンマを使った 93 00:05:34,120 --> 00:05:37,800 JavaやCのような構文に慣れている皆さんには 94 00:05:37,960 --> 00:05:42,240 フラストレーションになるようですが 95 00:05:42,400 --> 00:05:44,520 こんな風に:を間に挟みます。 96 00:05:46,640 --> 00:05:50,040 この例で見ていただきたいのは 97 00:05:50,200 --> 00:05:55,360 メッセージはkayword1keyword2だということです。 98 00:05:58,440 --> 00:06:02,760 これで完結したメッセージです。 2つの部分から構成されています。 99 00:06:05,840 --> 00:06:09,440 ではテストの時間です。 数秒ずつで答えてください。 100 00:06:09,600 --> 00:06:15,480 これらのメッセージは何でしょうか? それぞれ何という種類のメッセージでしょうか? 101 00:06:15,640 --> 00:06:18,320 1つ目のものは引数がありません。 これは単項メッセージです。 102 00:06:18,480 --> 00:06:20,360 2つ目も同じです。 103 00:06:20,520 --> 00:06:22,960 コロンがあります。 キーワードメッセージです。 104 00:06:23,120 --> 00:06:26,840 よくわからないコンマがあって何かしています。 二項です。 105 00:06:27,000 --> 00:06:31,080 変ですね。二項です。 引数がありません。単項です。 106 00:06:31,240 --> 00:06:33,720 コロンがあります。キーワードです。 107 00:06:33,880 --> 00:06:36,160 難しいように見えるかもしれませんが 108 00:06:36,320 --> 00:06:38,200 これが解答です。 109 00:06:38,800 --> 00:06:40,080 例えば 110 00:06:40,240 --> 00:06:43,600 点のx値を変えたいとします。 111 00:06:43,760 --> 00:06:47,320 これは点です。二項メッセージです。 112 00:06:48,000 --> 00:06:50,400 setX: と引数を書きます。 113 00:06:50,560 --> 00:06:53,360 これでx値が2に変わった点が返ってきます。 114 00:06:53,920 --> 00:06:55,880 それほど難しくないですよね? 115 00:06:56,960 --> 00:07:00,800 次に at:put: メッセージです。 配列があります。 116 00:07:04,040 --> 00:07:08,200 配列には文字列が格納されています。 'Calvin' 'hates' 'Suzie'です。 117 00:07:08,840 --> 00:07:12,120 2つ目の要素を変更します。 118 00:07:12,280 --> 00:07:15,960 「at: 2 put: 'loves'」と書きます。 119 00:07:16,120 --> 00:07:18,760 これが2番目の要素です。 なので、'loves'がここに来ます。 120 00:07:18,920 --> 00:07:21,120 配列について このメソッドは 121 00:07:21,280 --> 00:07:24,600 at:put: と呼ばれています。 122 00:07:24,760 --> 00:07:28,240 このメソッドは集合の 与えられた添字の値を変更します。 123 00:07:28,400 --> 00:07:33,160 お分かりのように Pharoでは添字は1から始まります。0ではなく。 124 00:07:33,320 --> 00:07:35,920 2番目の要素が欲しいので 1、2と数えるのです。 125 00:07:36,080 --> 00:07:38,360 引き算したりする必要はありません。 126 00:07:40,520 --> 00:07:46,080 キーワードメッセージの例が もう1つあります。 127 00:07:46,240 --> 00:07:49,640 12が (12は整数です) 128 00:07:49,800 --> 00:07:51,920 10と20の間かどうか訊きます。 129 00:07:52,960 --> 00:07:57,680 between:and: メッセージです。 130 00:07:58,840 --> 00:08:03,520 構文的には 131 00:08:05,280 --> 00:08:08,520 12.betweenAnd(10,20). と同じです。 132 00:08:10,400 --> 00:08:13,680 これについては もう良いでしょう。 133 00:08:14,560 --> 00:08:16,560 メッセージには3種類あります。 134 00:08:16,720 --> 00:08:19,920 単項、二項、そしてキーワードです。 135 00:08:20,960 --> 00:08:22,000 以上です。