pepsi学習中

いつも参考にさせていただいているid:sumimさんにリンクされてしまいました。光栄だ~

id:sumim:20070306:p1

Cokeは凄い人たちに任せてもっぱらpepsiで遊んでいるのですが、せっかくなのでたらい回し関数のpepsi版を晒します。

{ import: st80 }
Time : Object()
Time millisecondClockValue
{
struct timeval tv;
gettimeofday(&tv, 0);
return (oop)(((tv.tv_sec * 1000 + tv.tv_usec / 1000) &0x3fffffff) << 1 | 1);
}
Time millisecondsToRun: block
[
| initialMilliseconds |
initialMilliseconds := self millisecondClockValue.
block value.
^ self millisecondClockValue - initialMilliseconds
]
StaticBlockClosure timeToRun
[
^ Time millisecondsToRun: self
]
TakY : Object ()
TakY x: x y: y z: z
[
x <= y ifTrue: [^ y].
^ self x: (self x: x - 1 y: y z: z)
y: (self x: y - 1 y: z z: x)
z: (self x: z - 1 y: x z: y)
]
[
[TakY x: 12 y: 6 z: 0] timeToRun println.
]

例によって前半はミリ秒での計測をするためのコードです。定義や呼び出しの本体は最後の10行ほどです。(id:sumimさんと同じコードが使えます)

#TimeのmillisecondsToRunの実装はrolloverの処理をはしょってますので危険な用途には使わないでください :)