読者です 読者をやめる 読者になる 読者になる

おがさわらなるひこのオープンソースとかプログラミングとか印刷技術とか

おがさわらなるひこ @naru0ga が技術系で興味を持ったりなんだりしたことをたまーに書くブログです。最近はてなダイアリー放置しすぎて記事書くたびにはてな記法忘れるのではてなブログに移行しました。

クリエイティブ・コモンズ・ライセンス
特に断りがない場合は、本ブログの筆者によるコンテンツは クリエイティブ・コモンズ 表示 - 継承 4.0 国際 ライセンスの下に提供されています。

Squeak Smalltalk 探検会 #2

第1回に続きイベント立ててやってきましたよ。

例によってSqueak By Example (SBE)を参考に。
今回はテキストを読んでる時間を減らして、例題をぱっぱかやっていくというハンズオンに近い形式。

環境のお話つづき

1章の残りは「Finding classes」*1 「Finding methods」「Defining a new method
」ということで、名前の通りシステムブラウザーメソッドファインダーの使い方をあれこれと、あとメソッドの定義の仕方を。最後に章のまとめ読んでおしまい。

システムブラウザー便利だね

システムブラウザーは、まあいいですね。Squeak Smalltalk の場合はクラスライブラリのドキュメントがあーだこーだってのはなくて、こうやって環境自身に聞けば、クラスの定義とか、メソッドの定義とか使い方とか、クラス階層とか、全部見られて楽しいんだよと*2

けっこう面白いのが、クラス名のサーチのところで、例えば "class" とタイプすると class を含むクラスを探してきてくれるのに対し、"Class" とタイプすると「Class」をいきなり見つけてきてくれる、という柔軟性。クラスは大文字で始める、ということを上手く使って、曖昧検索?か、直接検索かを使い分けてる。

なお Squeak 4.1 の環境で画面を狭く使うと「クラス」「インスタンス」の間の「?」がしばらく見つけられなくて一瞬???となったのはご愛敬でございます。

メソッドファインダースゲー!

みんなで感動したのはメソッドファインダー。

それでもメソッド名の部分文字列を入れて、そのメソッドが実装されているクラスを横断的に検索する機能は、便利だね、でまぁよかった。これならぼくも知っていたし。

びびりまくったのは「.」を使った「結果からメソッドを推測する」機能。
例えば、

'eureka' . 'EUREKA' 

と入力ペインに入れて実行すると、

'eureka' asUppercase --> 'EUREKA' 

とすぐ下に表示され、「asUppercase は Character と String に定義があるけど、String じゃね?」って教えてくれるとか。

SBE の別の例を引くと、

25 . 35 . 5

とやると、25 gcd: 35 --> 5 になるから、Integer gcd: じゃね? と見つけてくれる。すげぇ、すげぇよメソッドファインダー!

メソッドを作ろう

まぁ Smalltalk に限らず、IDE でプログラム書くときは「えっと、どこから始めるんだっけ?」な感じになる訳なので、まぁそれを、TDD を使いながら……って、えっ?

単純なメソッド追加の話なのに、なぜか SUnit を持ち出すところが強引でステキでした。その割には続きの自前アプリケーションだと使わないんだよな (^^;)
まあそれはいいとして。

けっこう驚かれたのは既存の String クラスをシステムブラウザーであけて、おもむろにそこで新しいメソッド定義をもりっと書いてセーブすると String クラスに新しいメソッドが追加できてしまうこと。
もちろん Ruby なんかでも既存クラスの拡張はできるけど、「ビルトインクラスを書き換えできるのなんか当たり前すぎて名前が付いてない」ぐらい普通なのが割とオドロキということみたい。それがシステムブラウザーで、メソッド名書き換えてはいセーブ、でできてしまうってことが。しかもイメージに保存されるので、「このイメージの String とあのイメージの String が同じとは限りませんよ」ってことになる。

私の理解だと、Smalltalk は自分の環境(イメージ)をいじくり倒してプログラムを作っていくものなので、既存クラスが書き換えられるのなんかその一要素に過ぎぬわ、わっはっは、ただしタコっちゃったら ChangeSet で戻せるよ、というのが古典的 Smalltalk で、でもまあ人と受け渡しするためにファイル単位に出し入れする仕組みも作っておいて、それでもさすがに今の複数人開発環境だと色々辛いねってことで Monticello とかあるのかなって想像してるんだけど、実開発したことないからわかんないんだよね。

この章のまとめ

テキスト丸写ししてもしょーがないのでぼく的ポイント。

  • 3ボタンマウスが買えない貧乏人は赤クリック (普通のクリック) とハロの出し方だけ覚えとけ。あとぼく自身滅多に使わないので割と忘れる。
  • キーボードショートカット超重要。CMD-D (Do it)、CMD-P (Print it)、CMD-I (Inspect it)、CMD-B (Browse it) とか死んでも忘れるな!

プログラムを書きましょう

さていきなりGUIでゲーム作るところが SBE のステキなところです。しかもクラスたった二つで。

作るゲームは Quinto ってヤツで、SBE の画面見たことはあるんだけど、この名前でぐぐるとそれっぽいのは出てこないんだよな。
どんなゲームか知りたい人は SBE の29ページみちくり。碁盤みたいなのがあって、クリックすると上下左右のセルが反転して、それを繰り返して全部反転させると勝ち……みたいなヤツじゃなかったっけ。

まぁこれを作りましょうと言うことで。


以下愚直にテキストを追いかけてくと一生書き終わらない気がしたのでヤメますが、内容としては:

  • SimpleSwitchMorph を継承して SBECell を作り、
  • initial メソッドを作って new のときの挙動を決め、
  • SBECell new を inspect it して実行ペインで self openInWorld して世界に登場させ、
  • ハロでぐりぐり動かした結果インスペクタの値が変わる、逆にインスペクタで値書き換えた結果が見た目に反映されることを体験して遊ぶ

てな感じでした。
最後のインタラクティブ性の面白さはけっこう楽しかったんじゃないかと思います。ぼくはこれにあこがれて Squeak やってるところがあるからなあ。

次回予告

今度は PARTAKE 使ってみました。
3/18(金) 20:00〜22:00、場所は新宿小滝橋ルノアール
花金(死語だよ)なので飲みにでもいっちゃう? とか考えてます。

途中参加もアリですのでお気軽にどぞ!

*1:日本語で言えば「ファインディング・クラス」って、それは日本語じゃねぇ! 「ファインディング・ニモ」ってなんで「ニモを探して」という邦題にできなかったんでしょうか……。

*2:逆に言うと、環境がないところで Smalltalk の本読んだり Web の記事読んだりすると、調べたいことが調べられなくてイラっとする(笑)。