﻿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）を定義します。
