ClosureCompiler その2

ここからの続き)

せっかく SqueakSmalltalk でもクロージャが使えるようになったので、たしかこちらが元ネタのカウンターのサンプルなぞ、あらためて試してみました。

counterMaker counter1 counter2
counterMaker _ [: count | [count _ count + 1]]. counter1 _ counterMaker value: 0. counter2 _ counterMaker value: 100. World findATranscript: nil. 10 timesRepeat: [ Transcript cr; show: counter1 value. Transcript tab; show: counter2 value]
=> 1   101
   2   102
   3   103
   4   104
   5   105
   6   106
   7   107
   8   108
   9   109
  10   110

#compileBlocksAsClosures が off だと従来通り、

=> 101   102
   103   104
   105   106
   107   108
   109   110
   111   112
   113   114
   115   116
   117   118
   119   120


う〜む、すばらしい。で、#compileBlocksAsClosures を on/off しながら、たった今、気付いたんですが、SqueakSmalltalk では、ブロック変数はもともと擬変数ではないんですね。

[: nn | nn := 10] value: 2

Squeak の場合(念のため Squeak1.13 で)

=> 10

ちなみに VisualWorks の場合

=> Attempt to store into argument

がーん。知らなかったよ… orz


続く