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。