Squeak4.1 ではようやくクロージャーがサポートされるらしい


個人的には実験的新機能導入に振り回されるのを嫌って Squeak の最新版を追わなくなって久しいですのですが、その“新機能”のひとつが待望のクロージャーサポートとなれば話は別。RC1 なるベータ版が公開されたようなので、さっそく試してみました。


見た目が Pharo テイストですね。新たにウィジェットの配置やアイコンなどにも手が入れられ、さらに小ぎれいになってきました。

http://squab.no-ip.com/collab/uploads/61/squeak41newgui.png



リリースノート(What's New)によると、UI のみならず内部的にもいろいろと整理が進んだようです。ただ、そこは悪名高き(…は言い過ぎか?)“Squeakクオリティ”。手が入ったってことは、それだけ壊された場所も多いってことを意味するので、なじみの機能の何がどこまで壊されているのか、こまかく調べてゆくのが今から恐ろしいです。^^;


とりあえず、#duplicateAllControlAndAltKeys しているくせに、コントロールキーを使ったコピペ(ctrl + x,c,v)や print it、do it(ctrl + p,d)などができないのはさすがに使いづらいので、さっそくこの問題を lazy fix 。

UTF32InputInterpreter >> nextCharFrom: sensor firstEvt: evtBuf 
"Fall back on MacRoman if char is 0"
^(evtBuf at: 6) > 31
ifTrue: [(evtBuf at: 6) asCharacter]
ifFalse: [(evtBuf at: 3) asCharacter macToSqueak].



さて、本題のクロージャーですが、What's New にもサンプルがあるように、普通に動きます。^^;

| fact |
fact := nil.
fact := [:n | n < 2 ifTrue: [n] ifFalse: [n * (fact value: n-1)]].
fact value: 10   "=> 3628800 "


これまでの Closure Compiler による拡張と違い、さすが正式サポートだけあって、デバッガも普通に動作します。

http://squab.no-ip.com/collab/uploads/61/squeak41debugrec.png


一連の機能拡張の名の下に行なわれた破壊行為により、いろいろと失われた物も多そうですが、とりあえずブロック(無名関数)の再帰に限っては、それだけのために VisualWorks に処理系を切り替えなければならないとか、いちいち copy fixTemps しなきゃ…とかがなくなるのでラクできそうです。すばらしい。