思い付きで Smalltalk をかじってみようと思った。処理系がいくつもあって。うち手っ取り早いのは Squeak と Pharo。
入門書が pdf でフリーなのは Squeak だから、とりあえず Squeak:
とは言えこのpdf、Squeak のVer. 3.0 を前提にしているようで。しかも日本語を表示させにくい。とりま Squeak 5.3 を四苦八苦して日本語表示させて使っている。
どうでもいいことだけど、なんで halo を「ハロー」って書くかなあ?実際の発音は /heilou/ だからヘイローぐらいにするのが妥当なんだけど…だいいち hello とおんなじになって区別がつかない。他に例があるか頭の中ひっかき回したら心理学でハロー効果というのがあるな。このハローが同じく halo だけど、これまたなんでハローと書くのかわからない。心理学に合わせる義理はなかろうに。
Squeak は成熟した処理系だけど、実際問題としてより多く使われているらしいのは Pharo。だいいち日本語表示させるのが簡単。
『自由自在…』の俳句ジェネレータが作れたところで、これを Pharo に移植しようと思った。
Pharo は Squeak のフォークだけど UI がぜんぜん違う。Squeak 版では PopUpMenu を使ってるけど、それじゃあ Pharo ではどうやってダイアログを出すんだ?と調べたら:
Pharo 4.0で[はい] / [いいえ] / [キャンセル]ダイアログを呼び出すにはどうすればよいですか? - Javaer101
「Pharo 4.0で」と書かれているけど、手元の Pharo 8.0 でも、この UIManager は使える。
問題は yes/no/cancel があって、それぞれ戻り値が true/false/nil。この nil の扱いが分からなくて、calcel をクリックしたらエラーで止まってデバッグが出る。昨日やーめたっ!と放棄。
今日になって再挑戦したら、どうにかなった。
upperFive := #('古池や' '夕暮れに' 'こどもたち' '父上よ' '寄せる波' 'つまみ食い').
middleSeven := #('そこのけそこのけ' '明日は我が身か' 'えらくなったな' '料理作って' '牛乳一本').
lowerFive := #('俺の夏' '仁王立ち' 'お姉さん' '高笑い' 'のぼり竜' '旅の後' '山ごもり' '知ってます').
loop:=true.[ loop ] whileTrue: [
haiku := upperFive atRandom, middleSeven atRandom, lowerFive atRandom.
response:=UIManager default question: haiku title: 'できた俳句'.
(response=nil) ifTrue: [ loop:=false. ] "cancelで抜ける"
ifFalse:[
(response) ifTrue: [ Transcript cr; show:haiku. ]. "okのとき表示"
]. "noのときは何もしない"
].
これで ok をクリックすれば Transcript に俳句が 表示され、no だと表示されない、cancel だと終了になる。
たぶん美しくないコーディングだけど、初心者ですから。