Squeak の俳句ジェネレータを Pharo で

 思い付きで Smalltalk をかじってみようと思った。処理系がいくつもあって。うち手っ取り早いのは Squeak と Pharo。

 

 入門書が pdf でフリーなのは Squeak だから、とりあえず Squeak

 

swikis.ddo.jp

 とは言えこの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 だと終了になる。

 たぶん美しくないコーディングだけど、初心者ですから。