Squeak3.9 でブロッククロージャ


3.9 の宣伝で(オプショナルながら)クロージャをサポート…みたいなことが書かれているのを見かけたので、どんなふうかと試してみました。いろいろと調べてみた結果、どうやら、SqueakMap 経由でインストールする必要があるらしく、3.9 で云々というのは、ちょっと言い過ぎのような感じもしなくもありません。有り体にいうと、これまでの ClosureCompiler が 3.9 に対応して NewCompiler というパッケージとして提供されているよ…というニュアンスかな、と。


以下、3.9 で、ブロッククロージャを使えるようにするための手順のメモ。リファクタリングブラウザの構文解析器を独立してパッケージ化した AST(abstract syntax tree。抽象構文木?)というのが必要なようです。

  • デスクトップメニュー → open... → SqueakMap Package Loader
  • 右上のリストペインから AST を選択 → 黄ボタンメニューの install
  • 同じくリストペインから NewCompiler を選択 → install


これで準備は完了です。プリファレンスに compiler カテゴリーが新設されて、#compileBlocksAsClosures と #compileUseNewCompiler が追加されているので、クロージャとして使いたいときには両方をオンにします。これで次のようなスクリプトを評価できるようになります。

| fact |
fact := nil.
fact := [:nn | nn < 2 ifTrue: [nn] ifFalse: [nn * (fact value: nn-1)]].
^ fact value: 10
=> 3628800


ただ、相変わらずデバッガが正常に動作しなくなるなどの問題があるので、必要なときだけオンにして使うのがよさそうです。