Squeak の Smalltalk で call/cc を使えるようにする

Squeak システムのインストール(念のため)

http://squeakland.jp/developer/ の指示に従ってセットアップ
http://squeakland.jp/developer/download/image/SqueakPlugin-dev-527.zip を入手、展開
・使用している OS 向けの仮想マシン(バーチャルマシン)を入手、解凍してSqueakPlugin-dev-527 へ
http://squeakland.jp/developer/download/SqueakV3.sources.zip を入手、解凍して SqueakPlugin-dev-527 へ

call/cc 関連ファイルの入手

http://minnow.cc.gatech.edu/squeak/uploads/2981/ContextCleanupPlus-ajh.2.zip
http://minnow.cc.gatech.edu/squeak/uploads/2981/Continuations-ajh.1.zip
入手して展開し、フォルダごと SqueakPlugin-dev-527 へ移動


なお、.zip ファイルの展開は Squeak 環境内でも可能です。

Squeak システムの起動と若干の設定(お好みで)

SqueakPlugin-dev-527.image を仮想マシンへドロップインするなどして起動
 ・何もないまっさらなデスクトップが現れる
文字を入力できる(コードを入力し評価できる)場所を用意する
 ・デスクトップメニュー → 開く… → ワークスペース
メニューなどを英語表記にして、日本語は入力だけ可能にする
 ・Locale switchAndInstallFontToID: #en をコピペして do it (alt/cmd + D)。以下同様。
 ・Locale currentPlatform: (Locale isoLanguage: 'ja')
フラップタブを表示する
 ・Preferences installTheme: #outOfTheBox
モーフ削除時にゴミ箱に移動せずただちに消去する
 ・Preferences disable: #preserveTrash
メニューをカーソルキーなどで操作可能に
 ・Preferences enable: #menuKeyboardControl


current platfrom の設定以外は GUI を使っても可能です。


適当なところで、デスクトップメニュー → save as... → Squeak_callcc.image → Accept(s) などとして仮想イメージを保存しておきましょう。

call/cc のインストール

ファイルリストを起動
 ・デスクトップメニュー → open... → file list
ContextCleanupPlus-ajh ディレクトリに移動
 ・左上のリストペインで ContextCleanupPlus-aj をクリック
1-GeneralEnh-ajh.cs をファイルイン
 ・右上のリストペインで 1-GeneralEnh-ajh.cs を選択
 ・右上の install ボタンをクリック。
同じ要領で、2-PreContextEnh-ajh.cs、3-ContextEnh-ajh.cs、4-PostContextEnh-ajh.cs の順にファイルイン
Continuations-ajh ディレクトリに移動
Continuations-ajh.cs、ContinuationTests-ab.cs をファイルイン
SqueakMap パッケージローダを起動
 ・デスクトップメニュー → open... → SqueakMap Package Loader
 ・バージョンアップを促されるので Yes で作業を進める
ClosureCompiler-ajh for 3.8 v2.2 をクリックして選択
 ・左上のリストペインから ClosureCompiler-ajh for 3.8 を探す
 ・三角印をクリックして展開し、2.2 をクリック
同リストペインの黄ボタンメニューから install を選択
 ・同リストペイン右上、スクロールバー直上の黄ボタンメニューボタンをクリック
 ・もしくは、同リストペイン内で黄ボタン(マウスの中ボタン)をクリック

クロージャ ON/OFF の設定と、その切換えを容易にするショートカットの設置

プリファレンスを起動
 ・デスクトップメニュー → appearance... → preferences...
#compileBlocksAsClosures オプションを呼び出す
 ・general タブ(?)をクリック
 ・あるいは「Type here, hit Search」のところに block などと入力後、enter キーで決定
ショートカットの設置
 ・ compileBlocksAsClosures のところをクリックしてメニューをポップアップ
 ・ hand me a button for this preference を選択
 ・ デスクトップの適当な場所にボタンを設置
クロージャ機能の ON
 ・ compileBlocksAsClosures の直前の □ をクリックして ■ に


GUI を介さずとも Preferences enable: #compileBlocksAsClosures もしくは、Preferences disable: #compileBlocksAsClosures の do it (alt/cmd + D) で ON/OFF は可能です。


このタイミングで再び、デスクトップメニュー → save で仮想イメージを保存しておきましょう。

ブロックがクロージャとして扱われているかどうかの確認

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

これをワークスペースなどにコピペして入力後、選択して print it (alt/cmd + P) 。

" #compileBlocksAsClosures が OFF のとき"
=> Attempt to evaluate a block that is already being evaluated.
" #compileBlocksAsClosures が ON のとき"
=> 3628800

call/cc が使えるかどうかの確認

| continuation |
continuation := [:cont | cont] callCC.
(3/4) inspect.
continuation ifNotNil: [continuation value: nil]

これをワークスペースなどにコピペして入力後、選択して do it (alt/cmd + D) 。インスペクタが2つ開けばOK。