サンタクロース問題を Squeak Smalltalk で 5


id:sumim:20070613:p1 の続き。

lethevert is a programmer - Java: Re: サンタクロース問題Java 版を Squeak Smalltalk で。Java における何ごともクラスで表現するスタイルを踏襲するのは思いのほか大変だと分かったので(^_^;)、お気楽なブロックを使った意訳。

| 動作中 トナカイ用 小人用 仲間 this 配達 会議 小人 トナカイたち 小人たち 回数 out |

out := SharedQueue new.

"サンタ"

動作中 := true.
トナカイ用 := SharedQueue new.
小人用 := SharedQueue new.

仲間 := [:名前 :待合所 |
    [   [動作中] whileTrue: [
            (Delay forMilliseconds: 1000 atRandom) wait.
            out nextPut: 名前, 'が来た。'.
            this := Processor activeProcess.
            待合所 nextPut: this.
            this suspend
        ]
    ] fixTemps fork name: 名前; yourself
].

配達 := [
    out nextPut: '配達・・・'.
    (Delay forMilliseconds: 1000 atRandom) wait.
    トナカイ用 size timesRepeat: [
        | 帰トナカイ |
        帰トナカイ := トナカイ用 next.
        out nextPut: 帰トナカイ name, 'が帰った。'.
        帰トナカイ resume
    ]
].

会議 := [
    out nextPut: '会議・・・'.
    (Delay forMilliseconds: 1000 atRandom) wait.
    3 timesRepeat: [
        小人 := 小人用 next.
        out nextPut: 小人 name, 'が帰った。'.
        小人 resume]
].


"main"

トナカイたち := (1 to: 9) collect: [:数 | 仲間 value: 'トナカイ', 数 printString value: トナカイ用].
小人たち := (1 to: 10) collect: [:数 | 仲間 value: '小人', 数 printString value: 小人用].

回数 := 0.

[回数 < 10] whileTrue: [
    (Delay forMilliseconds: 10) wait.
    トナカイ用 size >= 9 ifTrue: [配達 value. 回数 := 回数 + 1] ifFalse: [
    小人用 size >= 3 ifTrue: [会議 value. 回数 := 回数 + 1]].
].

動作中 := false.
トナカイたち do: [:ト | ト terminate].
小人たち do: [:小 | 小 terminate].

World findATranscript: nil.
Transcript clear.
out size timesRepeat: [Transcript cr; show: out next]


出力例。

トナカイ8が来た。
小人6が来た。
トナカイ5が来た。
トナカイ2が来た。
トナカイ9が来た。
小人2が来た。
小人9が来た。
会議・・・
小人5が来た。
小人4が来た。
トナカイ1が来た。
小人8が来た。
小人3が来た。
トナカイ4が来た。
小人10が来た。
トナカイ3が来た。
トナカイ7が来た。
トナカイ6が来た。
小人1が来た。
小人7が来た。
小人6が帰った。
小人2が帰った。
小人9が帰った。
配達・・・
トナカイ8が帰った。
トナカイ5が帰った。
トナカイ2が帰った。
トナカイ9が帰った。
トナカイ1が帰った。
トナカイ4が帰った。
トナカイ3が帰った。
トナカイ7が帰った。
トナカイ6が帰った。
会議・・・
小人5が帰った。
小人4が帰った。
小人8が帰った。
会議・・・
小人2が来た。
小人6が来た。
トナカイ5が来た。
トナカイ9が来た。
トナカイ3が来た。
小人5が来た。
トナカイ4が来た。
小人9が来た。
小人8が来た。
小人3が帰った。
小人10が帰った。
小人1が帰った。
会議・・・
トナカイ6が来た。
トナカイ1が来た。
トナカイ7が来た。
小人3が来た。
トナカイ8が来た。
小人7が帰った。
小人2が帰った。
小人6が帰った。
会議・・・
小人6が来た。
小人4が来た。
トナカイ2が来た。
小人2が来た。
小人7が来た。
小人10が来た。
小人1が来た。
小人5が帰った。
小人9が帰った。
小人8が帰った。
配達・・・
小人5が来た。
小人9が来た。
トナカイ5が帰った。
トナカイ9が帰った。
トナカイ3が帰った。
トナカイ4が帰った。
トナカイ6が帰った。
トナカイ1が帰った。
トナカイ7が帰った。
トナカイ8が帰った。
トナカイ2が帰った。
会議・・・
小人3が帰った。
小人6が帰った。
小人4が帰った。
会議・・・
トナカイ6が来た。
トナカイ3が来た。
小人6が来た。
トナカイ4が来た。
トナカイ8が来た。
小人8が来た。
トナカイ5が来た。
小人2が帰った。
小人7が帰った。
小人10が帰った。
会議・・・
トナカイ2が来た。
トナカイ1が来た。
トナカイ7が来た。
小人7が来た。
トナカイ9が来た。
小人3が来た。
小人2が来た。
小人4が来た。
小人10が来た。
小人1が帰った。
小人5が帰った。
小人9が帰った。