Squeak3.9 ではワークスペース変数の自動登録がオン/オフ可能に


いじっていて気が付いた 3.9 のちょっといい機能 その1(って、続きがあるかわかりませんが…)


ワークスペース変数は、その名のとおりワークスペースで使うことができる変数で、グローバル変数の一種です。ワークスペースで評価したコードに含まれる変数のうち、グローバル変数(辞書「Smalltalk」のキー)、あるいは、テンポラリ変数(スクリプト中で | | に囲んでおく)として宣言されていない場合、自動的に登録され、以後も宣言せずに使うことができる便利な変数…なのですが、変数名のタイプミスがあってもスペルチェックが効かず、Smalltalk としてはめずらしいくらい見つけにくいバグを生んだりするやっかいものであったりもします。


私はこの機能を(便利の皮をかぶった…)“完全な悪”として捉えていたので、ワークスペースのウインドウメニューにある「create textual references to dropped morphs」と連動させて無効にする自前の細工を施したり、そもそもスクリプティングに際してはワークスペースを使わない(ファイルリストのエディタモードを使用する)ようにして、徹底的に排除する立場をとっていました。


しかし、3.9 では、明示的にこのワークスペースの自動登録の機能をオフにしたり、登録済みのワークスペース変数を破棄する機能が追加されたようです。ただ残念ながらメニュー項目が作りかけのまま放置されているようなので、修正をしておきました。このファイルをファイルインすると、メニュー項目にあるモードインジケータが正常に切り替わるようになります。

http://squab.no-ip.com:8080/collab/uploads/61/switchwkspvars.png


個人的にはファイルリストのエディタモードが便利なので(ワークスペース変数がそもそも使えない以外にも、イメージを保存することなしに書いたものを accept (alt/cmd + s) で手軽に保存、更新できる…)、今後もあいかわらず使い続けるでしょうが、チュートリアルを書くときにはワークスペースワークスペース変数の自動登録をオン/オフしながら、話を進められるのは(単純な話をさっと流したいときなどには)きっと便利だろうな…と思いました。

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


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