Strongtalk でワークスペーススクリプト

最適化されませんが、できます。おおしま さんのを拝借して。

| benchmark <[Int, [], ^Number]> fact <[Int, ^Number]> result <Number> |
benchmark := [:n <Int> :c <[]> |
  (Time millisecondsToRun: [n timesRepeat: [c value]]) * 1000.0 / n].

fact := [:n <Int> | (2 to: n) inject: 1 into: [:s <Number> :t <Number>  | s * t]].

result := benchmark value: 100000 value: [fact value: 10].
'Strongtalk: ', result  printString, ' MicroSeconds per call'
=> Strongtalk: 1.48  MicroSeconds per call

なお、じつは型チェックは最適化には影響しないので、

benchmark fact result
benchmark := [:n :c | (Time millisecondsToRun: [n timesRepeat: [c value]]) * 1000.0 / n]. fact := [:n | (2 to: n) inject: 1 into: [:s :t | s * t]]. result := benchmark value: 100000 value: [fact value: 10]. 'Strongtalk: ', result printString, ' MicroSeconds per call'

としても、計測の結果は同じです。もちろん、10 factorial なら速くなります。ただ、メソッドにしてあれば #inject:into:(ループ)版も #factorial(再帰)版も、結果は変わりません。