1 00:00:00,040 --> 00:00:02,880 今回は構文の概略をします。 2 00:00:03,040 --> 00:00:06,240 構文全体をお見せしますが 3 00:00:06,400 --> 00:00:09,440 完全に理解できなくても 深刻にならないでください。 4 00:00:09,600 --> 00:00:11,400 後でまた繰り返しますので。 5 00:00:11,560 --> 00:00:15,360 まずは Pharo にある構文全てをお見せします。 6 00:00:16,040 --> 00:00:20,000 まずは主要な構文要素を見ていきましょう。 7 00:00:20,160 --> 00:00:22,760 3 種類のメッセージを見て 8 00:00:22,920 --> 00:00:25,280 そしてブロック構文を見ます。 9 00:00:25,440 --> 00:00:27,440 Pharo の本質的な部分です。 10 00:00:27,600 --> 00:00:32,000 全てを理解できなくても心配しないでください。 全てまたやりますので。 11 00:00:33,120 --> 00:00:37,320 思い出してください。 全ての構文がこのスライドに載っています。 12 00:00:37,480 --> 00:00:40,040 これからちょっとだけ詳細に踏み込みます。 13 00:00:40,200 --> 00:00:43,960 これは exampleWithNumber のメソッド定義です。 14 00:00:44,120 --> 00:00:46,120 引数があります。 15 00:00:46,360 --> 00:00:51,040 縦棒がついたローカル変数定義があります。 16 00:00:51,200 --> 00:00:54,040 値を返す、リターンがあります。 17 00:00:54,200 --> 00:00:57,400 ループがあり、代入があります。 18 00:00:57,560 --> 00:01:01,640 ピリオドは、命令のセパレーターです。 19 00:01:03,120 --> 00:01:05,600 これらを全て見ていきます。 20 00:01:07,040 --> 00:01:10,080 伝統的といえる Hello World から始めます。 21 00:01:10,240 --> 00:01:12,000 ここで、もし良かったら 22 00:01:12,160 --> 00:01:16,400 全ての命令は Pharo 上で実行して 23 00:01:16,560 --> 00:01:18,360 結果を見ることができます。 24 00:01:18,520 --> 00:01:21,440 ここに文字列がありますが 25 00:01:21,840 --> 00:01:25,880 グラフィック要素である Morph に変換して 26 00:01:26,040 --> 00:01:29,640 ウィンドウで開くように お願いすることができます。 27 00:01:29,840 --> 00:01:33,320 つまり、文字列オブジェクトに asMorph を送り 28 00:01:33,480 --> 00:01:36,080 openInWindow を 29 00:01:36,240 --> 00:01:37,920 得られた Morph に送ります。 30 00:01:38,080 --> 00:01:41,480 つまり、2 つのメッセージ送信と 1 つの文字列オブジェクトがあります。 31 00:01:42,520 --> 00:01:43,960 より複雑な例もあります。 32 00:01:44,120 --> 00:01:47,920 ウェブから Pharo のロゴを 取得したいとします。 33 00:01:48,280 --> 00:01:50,800 その方法はこうです。 34 00:01:50,960 --> 00:01:56,840 ZnEasy getPng: を URL 文字列 を付けて実行します。 35 00:01:57,000 --> 00:02:00,000 読み込みたいリソースの URL です。 36 00:02:00,160 --> 00:02:04,440 そして、またグラフィックオブジェクトに変換し 37 00:02:04,600 --> 00:02:06,760 ウィンドウで開くようにお願いします。 38 00:02:06,920 --> 00:02:09,200 ZnEasy はクラスです。 39 00:02:09,360 --> 00:02:12,480 クラスは大文字で始まります。 40 00:02:12,640 --> 00:02:17,800 getPng: メッセージのコロン(:)は 引数がくるという意味です。 41 00:02:17,960 --> 00:02:22,120 引数は文字列 http://pharo.org です。 42 00:02:22,280 --> 00:02:27,120 この文字列は getPng: メッセージの引数です。 43 00:02:28,280 --> 00:02:32,520 asMorph メッセージと openInWindow メッセージは 44 00:02:32,680 --> 00:02:35,400 左から右へと読みます。 45 00:02:35,800 --> 00:02:38,640 ここで、このコードを Pharo 上に 46 00:02:38,800 --> 00:02:41,000 コピー&ペーストするかキーボード入力すれば 47 00:02:41,160 --> 00:02:43,760 Pharo のロゴが得られます。 48 00:02:43,920 --> 00:02:47,200 Pharo にはどんな構文要素があるのでしょう? 49 00:02:47,360 --> 00:02:50,680 コメントがあります。 二重引用符で始まります。 50 00:02:50,840 --> 00:02:52,200 これがコメントです。 51 00:02:52,360 --> 00:02:55,840 文字は頭にドルマークが付きます。 52 00:02:56,000 --> 00:02:58,080 $A は文字 A です。 53 00:02:58,240 --> 00:03:02,280 文字列は引用符で始まり 引用符で終わります。 54 00:03:03,400 --> 00:03:05,920 シンボルがあります。 ユニークな文字列です。 55 00:03:06,080 --> 00:03:10,320 シンボルはこんな風に ハッシュタグが付いています。 56 00:03:10,480 --> 00:03:12,840 #a はシンボル a です。 57 00:03:13,000 --> 00:03:14,600 リテラル配列があります。 58 00:03:14,760 --> 00:03:19,200 これは 12、23、36 の 3 要素からなる リテラル配列です。 59 00:03:19,560 --> 00:03:22,280 整数には様々な表現がありますが 60 00:03:22,440 --> 00:03:24,600 それについては掘り下げません。 61 00:03:24,760 --> 00:03:27,360 通常は 10 進法表現を使います。 62 00:03:27,520 --> 00:03:30,240 しかし必要ならば 2 進法も使えます。 63 00:03:30,400 --> 00:03:32,760 実数もあります。 同じように色々な表現があります。 64 00:03:32,920 --> 00:03:35,200 必要ならば構文を見つけることができます。 65 00:03:35,360 --> 00:03:38,080 true と false の真偽値があります。 66 00:03:38,240 --> 00:03:39,800 未定義値もあります。 67 00:03:39,960 --> 00:03:43,640 Java での null は Pharo では nil です。 68 00:03:43,800 --> 00:03:47,200 nil は UndefinedObject クラスの インスタンスです。 69 00:03:47,480 --> 00:03:49,320 点もあります。 70 00:03:49,480 --> 00:03:52,720 Pharo での点は 71 00:03:52,880 --> 00:03:56,440 例えば 10 @ 200 と表現します。 72 00:03:56,600 --> 00:03:59,880 x が 10、y が 200 の 73 00:04:00,040 --> 00:04:02,440 点を生成します。 74 00:04:03,680 --> 00:04:07,040 構文の本質的な要素を見てきました。 75 00:04:07,200 --> 00:04:09,840 言語の構成を見ていきます。 76 00:04:10,000 --> 00:04:13,040 一時変数宣言があります。 77 00:04:13,200 --> 00:04:16,200 一時変数宣言は縦棒のペアです。 78 00:04:16,360 --> 00:04:19,320 代入はコロンと等号です。 79 00:04:19,480 --> 00:04:22,520 変数 var に aValue を代入します。 80 00:04:22,720 --> 00:04:24,640 メッセージがあります。 81 00:04:24,800 --> 00:04:26,280 一連のメッセージを 82 00:04:26,440 --> 00:04:28,240 区切るのは 83 00:04:28,400 --> 00:04:30,760 ピリオドです。 84 00:04:30,920 --> 00:04:32,000 リターンがあります。 85 00:04:32,160 --> 00:04:34,560 関数やメソッドが値を返します。 gives a value. 86 00:04:34,720 --> 00:04:39,520 英語でいうところのキャレットを使います。 87 00:04:39,680 --> 00:04:41,200 そしてブロックがあります。 88 00:04:41,360 --> 00:04:45,760 技術的に言えばレキシカルクロージャですが are lexical closures, 89 00:04:46,480 --> 00:04:49,840 匿名メソッドと見做してもかまいません。 90 00:04:50,000 --> 00:04:53,120 ブロックについて簡単に説明します。 91 00:04:53,280 --> 00:04:55,880 ブロックは角括弧で定義されます。 92 00:04:56,680 --> 00:04:59,560 ブロックは value メッセージで実行されます。 93 00:04:59,720 --> 00:05:01,160 あとで見てみましょう。 94 00:05:01,320 --> 00:05:03,960 これで全ての構文構成です。 95 00:05:05,240 --> 00:05:08,520 それでは Pharo プログラムの本質は何でしょう? 96 00:05:08,680 --> 00:05:12,240 それは、メッセージを使って オブジェクトを作ることです。 97 00:05:12,400 --> 00:05:14,320 これらのオブジェクトにメッセージを送って 98 00:05:14,480 --> 00:05:17,280 あれやこれや、ブロックを使って。 99 00:05:17,440 --> 00:05:18,680 それが全てです。 100 00:05:19,800 --> 00:05:23,080 Pharo には 3 種類のメッセージがあります。 なぜでしょう? 101 00:05:23,240 --> 00:05:26,560 必要な括弧の数を最小限にするためです。 102 00:05:26,720 --> 00:05:28,320 メッセージは良い感じにシンプルです。 103 00:05:28,480 --> 00:05:32,360 単項メッセージはレシーバーとセレクター から成っています。 104 00:05:32,520 --> 00:05:35,480 例えば、9 squared (9 の自乗)です。 105 00:05:35,640 --> 00:05:37,680 今日の日付が必要であれば 106 00:05:37,840 --> 00:05:41,480 Date クラスに today メッセージを送ります。 107 00:05:41,960 --> 00:05:43,800 引数はありません。 108 00:05:43,960 --> 00:05:46,080 次に、二項メッセージです。 109 00:05:46,240 --> 00:05:50,800 二項メッセージは レシーバー、セレクター、引数、という形式です。 110 00:05:51,160 --> 00:05:52,640 ただし、セレクターは 111 00:05:52,800 --> 00:05:57,320 +, -, ~, =, 等です。 112 00:05:57,480 --> 00:06:01,080 これらの数学的な記号は全て二項メッセージです。 113 00:06:01,360 --> 00:06:04,560 ここに 1 + 2 とありますが これはメッセージです。 114 00:06:04,720 --> 00:06:08,080 オブジェクト 1 に メッセージ + を 引数 2 を付けて送ります。 115 00:06:08,240 --> 00:06:11,240 @ で点を生成するのもメッセージです。 116 00:06:11,400 --> 00:06:12,760 二項メッセージです。 117 00:06:12,920 --> 00:06:16,160 ここで、点 3 @ 4 を 118 00:06:16,320 --> 00:06:18,640 メッセージ @ を送ることで 生成しています。 119 00:06:18,800 --> 00:06:22,200 そして、我々が呼ぶところの キーワードメッセージがあります。 120 00:06:22,360 --> 00:06:24,920 キーワードメッセージは 121 00:06:25,080 --> 00:06:28,840 レシーバー、キー1:、引数1、キー2:、引数2 という形式を取ります。 122 00:06:29,000 --> 00:06:31,440 例えば… 123 00:06:31,600 --> 00:06:34,720 2 between: 10 and: 20 です。 124 00:06:35,000 --> 00:06:38,760 これを Java や C で書くとしたら 125 00:06:39,000 --> 00:06:44,320 betweenAnd(10, 20) 126 00:06:44,480 --> 00:06:48,920 のように書くでしょう。 127 00:06:49,080 --> 00:06:53,720 Pharo ではこれを キーとキーという形式で表現します。 128 00:06:53,880 --> 00:06:57,520 後でまた見ますが、これが構文のポイントです。 129 00:06:58,800 --> 00:07:02,680 メッセージ間に優先順位があります。 130 00:07:02,840 --> 00:07:06,480 システムは次の優先順位で実行します。 括弧 131 00:07:06,640 --> 00:07:09,200 単項メッセージ 二項メッセージ、そしてキーワードメッセージ。 132 00:07:09,360 --> 00:07:10,160 こうなっているのは 133 00:07:10,320 --> 00:07:13,560 煩雑な括弧を書かずに済ませるためです。 134 00:07:13,720 --> 00:07:17,880 やろうと思えば、あらゆるところで 括弧だらけにしても良いのですが 135 00:07:18,040 --> 00:07:20,000 コードはまともに読めなくなるでしょう。 136 00:07:20,960 --> 00:07:24,680 それぞれの種類のメッセージについて 簡単におさらいします。 137 00:07:24,840 --> 00:07:27,680 単項メッセージ。 10000 factorial 138 00:07:27,840 --> 00:07:30,160 実行してみてください。 とても大きな数です。 139 00:07:30,320 --> 00:07:33,640 オブジェクト 10000 に メッセージ factorial を送ります。 140 00:07:33,800 --> 00:07:36,240 引数はありません。 それが単項メッセージです。 141 00:07:36,880 --> 00:07:41,840 同様に、二項メッセージがあります。 1+3 は二項メッセージです。 142 00:07:42,000 --> 00:07:46,720 セレクター つまりメソッドの名前は、+ です。 143 00:07:47,360 --> 00:07:52,040 オブジェクト 1 に メッセージ + を 引数としてオブジェクト 3 を付けて送ります。 144 00:07:53,120 --> 00:07:55,960 キーワードメッセージは 前に説明しましたが 145 00:07:56,120 --> 00:08:00,360 また説明します。 教えるということは繰り返すということです。 146 00:08:00,800 --> 00:08:04,520 キーワードメッセージは 147 00:08:04,680 --> 00:08:07,560 引数付きのメッセージで 148 00:08:07,720 --> 00:08:11,080 引数はメッセージの中に入り込んでいます。 149 00:08:11,240 --> 00:08:14,680 元の発想としては 子供がつかうための構文で 150 00:08:14,840 --> 00:08:18,320 ある意味、英語に近いものです。 151 00:08:18,480 --> 00:08:24,280 引数をメッセージの内側に取り込みます。 152 00:08:25,440 --> 00:08:29,120 例えば、HTTP リクエストを送るとします。 153 00:08:29,280 --> 00:08:32,880 ZnClient は Pharo の HTTP クライアントです。 154 00:08:33,040 --> 00:08:35,880 Zn クライアントのインスタンスを生成します。 155 00:08:36,040 --> 00:08:40,680 new は単項メッセージで 引数はありません。コロンはありません。 156 00:08:41,560 --> 00:08:46,720 url: はキーワードメッセージで コロンが付いています。 157 00:08:46,880 --> 00:08:49,880 queryAt:put: 158 00:08:50,040 --> 00:08:52,600 もキーワードメッセージです。 159 00:08:52,760 --> 00:08:54,880 get は単項メッセージです。 160 00:08:55,360 --> 00:08:59,400 この例の中に、セミコロンがあります。 161 00:08:59,760 --> 00:09:02,120 これはカスケードと呼ばれるもので 162 00:09:02,880 --> 00:09:05,800 全てのメッセージを 同じオブジェクトに送ります。 163 00:09:05,960 --> 00:09:08,920 一時変数が必要ありません。 164 00:09:09,080 --> 00:09:12,320 そしてよりコンパクトなコードをかけます。 165 00:09:13,720 --> 00:09:17,080 メッセージはあらゆる所にある ということを理解してください。 166 00:09:17,240 --> 00:09:20,880 条件分岐、ループ、列挙、並行処理は メッセージとして表現されます。 167 00:09:21,040 --> 00:09:23,480 これらの 3 つのメッセージについての説明は 168 00:09:23,640 --> 00:09:25,560 あらゆる所で適用されます。 169 00:09:25,720 --> 00:09:27,760 それはシステムの要石なのです。 170 00:09:27,920 --> 00:09:31,000 これらのメッセージ以外には 何もありません。 171 00:09:31,520 --> 00:09:32,880 見てみましょう。 172 00:09:33,040 --> 00:09:35,520 ここに階乗の定義があります。 173 00:09:35,680 --> 00:09:37,200 これをどう定義したらよいでしょう? 174 00:09:37,360 --> 00:09:40,160 factorial メソッドを定義します。 175 00:09:40,320 --> 00:09:43,840 このメソッドにコメントを書きます。 二重引用符を使います。 176 00:09:44,000 --> 00:09:45,360 そして、self で始めます。 177 00:09:45,520 --> 00:09:47,560 もしメッセージを受け取った このオブジェクトがゼロならば 178 00:09:47,720 --> 00:09:49,600 1 を返します。 179 00:09:49,760 --> 00:09:51,320 もし self が正ならば 180 00:09:51,480 --> 00:09:55,160 例えば factorial 6 ならば self = 6 です。 181 00:09:55,480 --> 00:09:58,120 もしもこれが true であれば 何を返したら良いでしょう? 182 00:09:58,280 --> 00:10:01,520 6 かける 6 ひく 1 の階乗 183 00:10:01,680 --> 00:10:04,920 この再帰的な定義はわかっています。 それだけのことですが 184 00:10:05,080 --> 00:10:08,120 ここで注目すべきところは 185 00:10:08,280 --> 00:10:10,440 条件分岐である ifTrue: は 186 00:10:10,600 --> 00:10:13,720 メッセージだということです。 コロン付きのキーワードメッセージで 187 00:10:13,880 --> 00:10:15,320 真偽値に送られています。 188 00:10:15,480 --> 00:10:18,800 同様に ifFalse:ifTrue: や ifTrue:ifFalse: もあります。 189 00:10:18,960 --> 00:10:21,440 これらの条件分岐は 190 00:10:21,600 --> 00:10:23,320 メッセージです。 191 00:10:23,480 --> 00:10:28,680 前に見せたのと同じような キーワードメッセージです。 192 00:10:29,080 --> 00:10:30,960 つまり、条件分岐はメッセージです。 193 00:10:31,120 --> 00:10:32,960 ループもメッセージです。 194 00:10:33,120 --> 00:10:35,160 1 から 4 までのループを作ると 195 00:10:35,320 --> 00:10:37,840 1 to: 4 do: 196 00:10:38,000 --> 00:10:40,080 そしてブロック。 匿名メソッドです。 197 00:10:40,240 --> 00:10:45,360 ここで、i の値を表示したいと言っています。 198 00:10:45,520 --> 00:10:50,320 そして 1, 2, 3, 4 という値を取ると。 199 00:10:50,480 --> 00:10:53,840 見ての通り、to:do: は 200 00:10:54,000 --> 00:10:56,280 キーワードメッセージです。 201 00:10:56,520 --> 00:10:59,960 loop の形をとったメッセージです。 202 00:11:00,120 --> 00:11:03,360 Pharo には他にもループがあります。 timesRepeat: や to:by:do: などです。 203 00:11:03,520 --> 00:11:05,360 それら全てを見ていきます。 204 00:11:05,520 --> 00:11:07,520 しかし、もう一度言いますが これらはメッセージです。 205 00:11:07,680 --> 00:11:11,440 to:do: はオブジェクト 1 に 4 と ブロックを引数として送られます。 206 00:11:11,600 --> 00:11:14,600 ブロックについてはすぐ後で説明します。 207 00:11:14,760 --> 00:11:16,480 イテレーターもあります。 208 00:11:16,640 --> 00:11:18,440 イテレータは別のものです。 209 00:11:18,600 --> 00:11:21,040 メッセージ do: を 210 00:11:21,200 --> 00:11:22,360 コレクションに送って 211 00:11:22,520 --> 00:11:25,680 各要素に対して何を適用するかを言います。 212 00:11:25,840 --> 00:11:29,320 各要素ごとに 関数の引数は 213 00:11:29,480 --> 00:11:34,440 1, 2, -4, -86 という値を取ります。 214 00:11:34,600 --> 00:11:36,960 そしてここでやっていることは 215 00:11:38,440 --> 00:11:40,800 各要素について 絶対値を求めて 表示することです。 216 00:11:40,960 --> 00:11:43,840 また言いますが これは別のコースでやります。 217 00:11:44,000 --> 00:11:45,720 イテレータを説明します。 218 00:11:45,880 --> 00:11:48,640 イテレータは Java 8 にもありますが 219 00:11:50,280 --> 00:11:53,240 Pharo の中核の一部になっています。 220 00:11:54,280 --> 00:11:55,760 ブロックとは何かというと 221 00:11:55,920 --> 00:11:57,680 ブロックは関数に似ています。 222 00:11:57,840 --> 00:12:01,320 数学では f(x) = x²+3 と書きますが 223 00:12:01,480 --> 00:12:03,920 このように書きます。 224 00:12:04,440 --> 00:12:07,320 ブロックを代入する変数を定義します。 225 00:12:07,480 --> 00:12:10,520 ブロックは角括弧の内側です。 226 00:12:10,680 --> 00:12:13,160 ここではブロックには引数が 1 つあります。 x です。 227 00:12:13,520 --> 00:12:16,640 そして本体を書きます。 x+3 です。 228 00:12:16,800 --> 00:12:18,600 このブロックを実行するには 229 00:12:18,760 --> 00:12:20,880 関数の適用です。 230 00:12:21,040 --> 00:12:24,600 これは関数の定義です。 ここで適用します。 231 00:12:24,760 --> 00:12:30,360 ブロックに value: メッセージを送ります。 value: 2 と書きます。 232 00:12:31,520 --> 00:12:35,080 x は 2です。 したがって、ブロックは 5 を返します。 233 00:12:35,520 --> 00:12:36,680 いいですか? 234 00:12:36,960 --> 00:12:41,560 ブロックとは、一種の匿名関数です。 名前がありません。 235 00:12:41,960 --> 00:12:46,160 実際には、ブロックはレキシカルクロージャです。 236 00:12:46,320 --> 00:12:48,240 それを説明します。 237 00:12:48,400 --> 00:12:50,360 ブロックは本物のオブジェクトです。 238 00:12:50,520 --> 00:12:54,440 メソッドの引数として渡されたり 変数に入れられたり 239 00:12:54,600 --> 00:12:55,720 返り値として返されます。 240 00:12:55,880 --> 00:12:58,600 したがって、ブロックは 241 00:12:58,760 --> 00:13:02,960 ウェブアプリケーションでの ボタンのコールバックに使われます。 242 00:13:04,480 --> 00:13:06,560 ブロックの使い方を見てきました。 243 00:13:06,720 --> 00:13:08,800 イテレーターにはブロックを使います。 244 00:13:08,960 --> 00:13:11,680 ブロックは条件分岐に使われることも 見てきました。 245 00:13:11,840 --> 00:13:13,600 後でブロックについての講義があります。 246 00:13:13,840 --> 00:13:16,440 ブロックはエレガントです。 Eiffel で導入され 247 00:13:16,600 --> 00:13:19,200 最近 Java 8 に導入されました。 248 00:13:19,360 --> 00:13:21,800 C# にもあります。 249 00:13:21,960 --> 00:13:23,200 とても基礎的なものです。 250 00:13:23,360 --> 00:13:26,320 ブロックは Pharo の構文や計算モデルの 251 00:13:26,480 --> 00:13:30,400 とても基礎的な要素です。 252 00:13:30,720 --> 00:13:33,600 Pharo ではどうやってクラスを 定義するのでしょう? 253 00:13:33,760 --> 00:13:37,480 ここにあるブラウザは パッケージを表示しています。 254 00:13:37,640 --> 00:13:39,960 その内部にクラスがあります。 255 00:13:40,120 --> 00:13:41,600 テンプレートを表示します。 256 00:13:41,760 --> 00:13:45,240 テンプレートは、 デフォルトで Object から継承すること 257 00:13:45,400 --> 00:13:47,480 クラスの名前 258 00:13:47,640 --> 00:13:51,160 例えば Point クラス 259 00:13:51,320 --> 00:13:53,360 そしてクラス定義 260 00:13:53,520 --> 00:13:56,840 クラスオブジェクトがあり そしてメッセージがあります! 261 00:13:57,000 --> 00:13:59,680 メッセージは subclass:InstanceVariableNames: 262 00:13:59,840 --> 00:14:01,160 なんたらかんたら 263 00:14:01,320 --> 00:14:02,160 これを使って 264 00:14:02,320 --> 00:14:04,960 Point クラスを定義すると 265 00:14:05,120 --> 00:14:07,920 インスタンス変数に x と y を入れます。 266 00:14:08,080 --> 00:14:13,640 見せたいことは、構文が常にメッセージと 同じモデルに従っているということです。 267 00:14:13,800 --> 00:14:16,680 通常、手で書くことはありません。 268 00:14:16,840 --> 00:14:20,960 ツールがテンプレートを渡して あなたはそれを埋めるだけです。 269 00:14:22,680 --> 00:14:24,480 ではメソッドはどうやって定義するのでしょう? 270 00:14:24,640 --> 00:14:27,400 前に言いましたが、メソッドは public で virtual です。 271 00:14:27,560 --> 00:14:29,240 そしてデフォルトで self を返します。 272 00:14:29,400 --> 00:14:31,720 ブラウザの中にいるときは 273 00:14:31,880 --> 00:14:34,120 ブラウザがテンプレートを出します。 274 00:14:34,280 --> 00:14:37,160 メソッドの名前、そして コメント… 275 00:14:37,320 --> 00:14:41,800 我々はお行儀よく親切に コードにコメントを書きます。 276 00:14:41,960 --> 00:14:46,800 一時変数の名前や文を 書き入れます。 277 00:14:46,960 --> 00:14:50,360 これでどうなるのでしょう? factorial メソッドを見ました。 278 00:14:50,520 --> 00:14:53,040 この場合、Integer クラスにいます。 279 00:14:53,200 --> 00:14:56,400 factorial メソッドを見ると そこにコードがあります。 280 00:14:56,560 --> 00:14:59,000 メソッド名 コメント 281 00:14:59,160 --> 00:15:02,040 そしてメソッド本体が定義されています。 282 00:15:03,840 --> 00:15:05,840 まとめると、何をやったかというと 283 00:15:06,000 --> 00:15:09,560 メッセージには 3 種類あります。 引数のない単項メッセージ 284 00:15:09,720 --> 00:15:12,760 セレクターが数学記号の二項メッセージ 285 00:15:12,920 --> 00:15:17,000 そして複数の引数を取ることができる キーワードメッセージです。 286 00:15:17,160 --> 00:15:20,720 優先順位があります。 最初に括弧 287 00:15:20,880 --> 00:15:23,080 そして単項、二項、そしてキーワードです。 288 00:15:23,240 --> 00:15:27,360 そして同じレベルのメッセージは 左から右へ。 289 00:15:27,600 --> 00:15:30,920 見てきた通り 構文はとてもコンパクトです。 290 00:15:31,160 --> 00:15:35,040 構文要素は少ししかありませんが 本当に表現力が高いです。 291 00:15:35,200 --> 00:15:39,480 構文要素は主にメッセージと レキシカルクロージャ(ブロック)です。 292 00:15:39,640 --> 00:15:42,400 メッセージは 3 種類です。 293 00:15:42,560 --> 00:15:45,160 言語を開発する演習問題をすることになります。 294 00:15:45,320 --> 00:15:49,200 いわゆるドメイン特化言語(DSL)を定義します。