Squeak Smalltalk 探検隊(#3.1〜#6)
いやーいくら何でもサボリすぎでしょう。
ということで私が主催しているイベント「Squeak Smalltalk 探検会」の報告を久しぶりに三回分まとめて。
過去のイベントは d:id:naruoga:20110126:1296733273 と d:id:naruoga:20110216:1298730485 を参考にしてちょ。
なんで「探検会」なのか?
すべての Smalltalk 処理系を触ったわけじゃないんだけど、Squeak 系の Smalltalk ってやっぱり「環境と戯れてる楽しみ」が大きいと思うんですよね。
なんかわかんないクラスがあったときにブラウザで眺めたり、それを眺めながらワークスペースでちょっと試したり、結果をインスペクタで覗いたり、メソッドファインダーで探したり、そういうのが楽しい。
だからテキストから頑張って学ぶとか、事前課題をやってきてみんなで発表するとか、誰かが講師役になるとかじゃなくて、「わかんないことは環境に聞く」っていう、そういう手探りの楽しさをみんなに持ち帰ってもらって、それぞれで遊んでもらう下地を作るってのが、私としての狙いなわけですよ。
「勉強」と構えるんじゃなくて、手探りでイロイロわかっていくこと、「分かり方を自分たちで体得していくこと」「その過程そのものを面白がること」を目指しているので、だから「探検会」と銘打っているわけですねん。
ぼく自身があんまり事前に予習したりしてなくて、英語をその場で読んで勘違いしてみんなに突っ込まれたりするのも、「ぼくが講師役」という構図ではなくしたいという意図を含んでたりします (まぁ、予習めんどうってもあるんですけど)。
#3.1
第3回は人が集まらなかったのとちょっと間が開いたおかげで、どちらかというと復習中心にやったので、第3.1回と称して第3回に予定していた内容をやりました。
確か途中までやってた Quinto ゲームを完成させるところまでやったんじゃないかな。
みんなで面白がっていたのは:
- 作ったクラスを new して Inspect it (Alt-I) するとその中が覗けること
- さらにインスペクタで openInWorld するとヘロっと出てくること
- メソッドとかインスタンス変数とか未定義のままでモリモリコード書いていくと、「これないんだけど作る?」とか聞いてきてくれること
- 無視してメソッドがないままで実行すると、実行時に「そんなのないよーん」と言われるから、そのときにへろへろって中身を書けばいい「ゆるふわ」さ
- メソッド明示的に値を返さないと self が帰っちゃうこと
あたりだったかな。
この回は切りが良かったので、ここでおしまい。
#4
やっと第3章に行って「Syntax in a nutshell」。
といっても Smalltalk 超文法シンプルだから一瞬で駆け抜けた。
次の章でやるので深入りはしなかったけど、二項演算子はみんな「キモイ」っていってたなー。まあ、それはそれで。
あと数値の radix 指定 (2r101 みたいなの) で r の左側に割となんでもかけちゃうところが面白いといっていろいろ試した。31rabc とか書いても大丈夫なんだよね。
ブロックの構文が非常に Ruby っぽいというのは、その場に Ruby な人がいなかったのであまり話題にならなかったかもしんない。そもそも、コレクションクラスとかに適用してみないとピンとこないしね。
ループや条件判定が Boolean とかが受け取ることができるメッセージに過ぎない (専用の構文すらない) というのはやっぱりちょっと面白いですよね。キモいと言われることもあるけど、これによって文法が非常にシンプルになるメリットは大きい。
でも文法は比較的容易に追加できる懐の深さもあるんだよーって話で sumim さんの二項メッセージに演算子強度を付加して小町算を解くブログエントリ紹介したり、それによってコンパイラの実装についてちょっとだけ盛り上がったりしたな。
#5 / #6
#5 は第4章「Understanding message syntax」だったんですが、#4 を欠席した方がいたので、第3章のチャプターサマリをちょっとだけ振り返り。
んで、ここも主にメッセージの強度の話なので、シンプルな文法の割に自然に読めちゃうのがカッコイイよねって話で盛り上がって、ついでに Objective-C の話とかしてた……ら、時間が来てしまったので中途半端なところで解散。
#6 はその続き。「ちょっと複雑なメッセージを読んでみよう」という例で色々絡みあった奴も、単項→二項→キーワードの結合則と、あとカッコを把握しておけばけっこうすっと読めちゃうということに感動。
あと #4 のときからの派生で、Squeak は割ときちんとレキサとパーサが分かれてるからクラシックな知識で読めるかもしんないね、とかいう話をした。
あとブロックの例が出てきたので、あとで「なんでブロック引数にはコロンがつくの? なくても意味的に区別つかない?」と参加者についったで聞かれ、「なんででしょうねー、後で調べますー」ってのんきに答えてたら、@kaminami さんに、
@kotrit @naru0ga キーワードなメソッドの定義は、at: index put: value のような感じで書きますが、ブロックの場合だとキーワード部分が無名になって、[: index : value | ] のように書けます。
http://twitter.com/#!/kaminami/status/112036132425969665
@kotrit @naru0ga さらに、": index"の:とindexの間のスペースは詰めるのが習慣になっています。 というような話が、以前オオシマさんだったかスミさんのblogにあったような気がします。
http://twitter.com/#!/kaminami/status/112036203863343104
と教えてもらいました。なるほど! あのコロンは文法的には「無名キーワードへのパラメータだよ」って意味になるのか! 目からウロコぽろぽろ。
ありがとうございましたっ!>@kaminami さん