

Smalltalk、特に Squeak Smalltalk は、言語処理系や IDE というより、あたかも“ゲストOS”のように振る舞うので、ちょっと試してみたいと思い立ってインストール＆起動まではできたものの、そこから先には、独自の GUI や操作スタイルに阻まれて進めなかった…という経験をお持ちの方も多いと思います。

そこで、Smalltalk 環境独自の GUI ツール群の使い方はあとで覚える（あるいはそもそもそれほど興味がない←しょぼーん…(^_^;)）として、今のところは、試してみたいコードを動かしたり、どんな動作になるのか確認ができればいい…といった忙しい人向けにざっくり、Smalltalk 式を評価するための方法のようなものを書いてみました。

とりあえず、マシンが Mac 以外（といっても、Mac の場合の違いは、ctrl + d とかが cmd + d になるだけ…）で、Squeak Smalltalk 環境は umejava さんの日本語版 Squeak3.9 のインストールおよび起動済みという前提で、オーソドックスな「カウンタ」オブジェクトを作ります。

なお、以下には、しょぼいながらも Smalltalk で「カウンタ」を記述するコードが出てくるので、まずは自分で考えてみたい場合はそれを終えてから読み進めたほうがよいと思います（当初「ネタバレ」と書いたワケはこれです）。







■ ブロック（無名関数）版カウンタ ツールはいっさい使わないようなことを書きましたが、コードを入力する場所くらいは用意しないといけないので、とりあえず、デスクトップクリック → 開く… → ワークスペース、で「ワークスペース」を起動します。ワークスペースというのは、Smalltalk-80 時代からある書き捨て用のメモソフトです。加えて最近のワークスペースには、宣言無しに出現した変数を半永続的な「ワークスペース変数」というある種のグローバル変数と見なしてくれる便利な（かつ、場合によってはやっかいな ←たとえば変数名のスペルミスを警告＆修正する機能が用をなさなくなる！）機能も付いています。

ワークスペースを立ち上げたら、そこに、次のコードをタイプして入力するか、ここからコピペして貼り付け（ctrl + v）ます。 counterMaker := [ :n | [n := n + 1 ] fixTemps]. c1 := counterMaker value: 0 . c2 := counterMaker value: 100 ctrl + a ですべてを選択し、do it (ctrl + d。右クリックの「式を評価」と同じ) します。ctrl の代わりに alt も使えます。これでワークスペース変数である c1、c2 にカウンタが代入されました。あとは、 c1 value もしくは、 c2 value をタイプして入力し、print it (ctrl + p。右クリックの「式を表示」も同じ) で各カウンタのインクリメントおよび内容の確認ができます。両方同時に確認したいときは、 {c1 value. c2 value} を print it (ctrl + p) するとよいでしょう。







付録その２： 似たようなことを Dolphin Smalltalk で くどいようですが、あくまで Smalltalk 独自のツール群の勉強をしている暇がないときに、最低限の操作とワークスペースのみでとりあえず…という特殊な想定ですのであしからず。勉強会などでは、事前にクラスブラウザの使い方を覚えてからそれを使ってください(^_^;)。

ブロックについては GNU Smalltalk と同じ注意（#fixTemps が不要、ブロック引数は代入不可、#initialize が自動的に呼ばれない）に加えて、 Squeak Smalltalk（と、その影響を受けた処理系）独自の { ... } という配列リテラルが使えないことを除けば Squeak Smalltalk と同じ式が使えるみたいです。 ただし式の評価は Squeak Smalltalk での do it (ctrl + d) や print it (ctrl + p) ではなく Evaluate It (ctrl + e) および Display It (ctrl + d) な点に注意。ワークスペースは、起動時に現れるウインドウの Workspace アイコンのダブルクリックにより呼び出せます。



counterMaker := [ :n | | m | m := n. [m := m + 1 ]]. c1 := counterMaker value: 0 . c2 := counterMaker value: 100 . Array with: c1 value with: c2 value. Array with: c1 value with: c2 value. Array with: c1 value with: c2 value. Object subclass: #Counter instanceVariableNames: 'counterValue' classVariableNames: '' poolDictionaries: '' category: 'Category-Name' . Counter compile: 'initialize counterValue := 0' . Counter compile: 'pushButton ^counterValue := counterValue + 1' . Counter class compile: 'new ^super new initialize; yourself' . c3 := Counter new . c3 pushButton. c3 pushButton; pushButton; pushButton.

Dolphin Smalltalk はほとんど使ったことがなかったのですが、Squeak Smalltalk のしょぼさにくらべると、補完機能の出来がすばらしいですね（ちなみに Squeak Smalltalk では alt + q の連打で補完される）。総じて、Smalltalk-80 直系の子孫である Squeak Smalltalk や Cincom Smalltalk より、過去のしがらみがないのがよいのか、今風の IDE っぽさが板に付いている感じがします。舞波さんお薦めなのもうなずけます。





