id:sumim:20070607:p1 の続き。
jijixi さんの JoCaml 版に触発されて、トナカイとこびとたちが独立したスレッドになっていてチョーかっこいいっ!&ところでこのサンタってぜんぜん寝ないですげー勤勉に働いてなくなくね?版。
| トナカイたち こびとたち 戻ってきたトナカイたち こびとたちの列 トナカイ こびと 勤務年数 出力 排他 | トナカイたち := #(ダッシャー ダンサー プランサー ヴィクセン ドンダー ブリッツェン キューピッド コメット ルドルフ). こびとたち := ($A to: $J) collect: [:chr | 'こびと「{1}」' format: {chr}]. 戻ってきたトナカイたち := SharedQueue new. こびとたちの列 := SharedQueue new. 出力 := String new writeStream. 排他 := Semaphore forMutualExclusion. トナカイ := [:各トナカイ名 | [ (Delay forMilliseconds: 100 atRandom) wait. 戻ってきたトナカイたち nextPut: 各トナカイ名. 排他 critical: [出力 cr; nextPutAll: '▼トナカイ「', 各トナカイ名, '」、戻る'] ] fixTemps fork ]. こびと := [:各こびと名 | [ (Delay forMilliseconds: 100 atRandom) wait. こびとたちの列 nextPut: 各こびと名. 排他 critical: [出力 cr; nextPutAll: 各こびと名, '、来訪'] ] fixTemps fork ]. トナカイたち do: [:各名前 | トナカイ value: 各名前]. こびとたち do: [:各名前 | こびと value: 各名前]. 勤務年数 := 2. [勤務年数 > 0] whileTrue: [ "サンタの日常" 戻ってきたトナカイたち size = 9 ifTrue: [ 勤務年数 := 勤務年数 - 1. 排他 critical: [出力 cr; nextPutAll: '▼サンタとトナカイたち、出発 → 戻る']. 9 timesRepeat: [トナカイ value: 戻ってきたトナカイたち next]. 排他 critical: [出力 cr; nextPutAll: '▼トナカイたち、ふたたびバケーションへ']]. こびとたちの列 size >= 3 ifTrue: [ | 三人組 | 三人組 := (1 to: 3) collect: [:idx | こびとたちの列 next]. 排他 critical: [出力 cr; nextPutAll: 三人組 printString, '、サンタと問題を解決']. 三人組 do: [:各名前 | こびと value: 各名前]. 排他 critical: [出力 cr; nextPutAll: 三人組 printString, '、各自の仕事に戻る']]]. World findATranscript: nil. Transcript clear. Transcript show: 出力 contents
こびと「F」、来訪 ▼トナカイ「ドンダー」、戻る こびと「A」、来訪 ▼トナカイ「キューピッド」、戻る こびと「D」、来訪 #('こびと「F」' 'こびと「A」' 'こびと「D」')、サンタと問題を解決 #('こびと「F」' 'こびと「A」' 'こびと「D」')、各自の仕事に戻る ▼トナカイ「プランサー」、戻る こびと「C」、来訪 こびと「H」、来訪 ▼トナカイ「ダッシャー」、戻る こびと「A」、来訪 #('こびと「C」' 'こびと「H」' 'こびと「A」')、サンタと問題を解決 #('こびと「C」' 'こびと「H」' 'こびと「A」')、各自の仕事に戻る こびと「I」、来訪 ▼トナカイ「ブリッツェン」、戻る こびと「G」、来訪 こびと「B」、来訪 #('こびと「I」' 'こびと「G」' 'こびと「B」')、サンタと問題を解決 #('こびと「I」' 'こびと「G」' 'こびと「B」')、各自の仕事に戻る ▼トナカイ「ヴィクセン」、戻る ▼トナカイ「ルドルフ」、戻る ▼トナカイ「ダンサー」、戻る こびと「E」、来訪 こびと「J」、来訪 ▼トナカイ「コメット」、戻る こびと「D」、来訪 ▼サンタとトナカイたち、出発 → 戻る ▼トナカイたち、ふたたびバケーションへ #('こびと「E」' 'こびと「J」' 'こびと「D」')、サンタと問題を解決 #('こびと「E」' 'こびと「J」' 'こびと「D」')、各自の仕事に戻る こびと「A」、来訪 こびと「F」、来訪 こびと「I」、来訪 こびと「G」、来訪 #('こびと「A」' 'こびと「F」' 'こびと「I」')、サンタと問題を解決 #('こびと「A」' 'こびと「F」' 'こびと「I」')、各自の仕事に戻る ▼トナカイ「プランサー」、戻る ▼トナカイ「ダンサー」、戻る こびと「C」、来訪 こびと「H」、来訪 こびと「A」、来訪 ▼トナカイ「ブリッツェン」、戻る こびと「B」、来訪 ▼トナカイ「ダッシャー」、戻る ▼トナカイ「キューピッド」、戻る こびと「F」、来訪 こびと「D」、来訪 こびと「J」、来訪 ▼トナカイ「ルドルフ」、戻る ▼トナカイ「コメット」、戻る こびと「E」、来訪 ▼トナカイ「ドンダー」、戻る ▼トナカイ「ヴィクセン」、戻る こびと「I」、来訪 #('こびと「G」' 'こびと「C」' 'こびと「H」')、サンタと問題を解決 #('こびと「G」' 'こびと「C」' 'こびと「H」')、各自の仕事に戻る ▼サンタとトナカイたち、出発 → 戻る ▼トナカイたち、ふたたびバケーションへ #('こびと「A」' 'こびと「B」' 'こびと「F」')、サンタと問題を解決 #('こびと「A」' 'こびと「B」' 'こびと「F」')、各自の仕事に戻る ▼トナカイ「ブリッツェン」、戻る ▼トナカイ「ダッシャー」、戻る こびと「A」、来訪 こびと「F」、来訪 こびと「G」、来訪 こびと「H」、来訪 こびと「C」、来訪 ▼トナカイ「キューピッド」、戻る ▼トナカイ「ヴィクセン」、戻る こびと「B」、来訪 ▼トナカイ「ドンダー」、戻る ▼トナカイ「プランサー」、戻る ▼トナカイ「ダンサー」、戻る ▼トナカイ「コメット」、戻る ▼トナカイ「ルドルフ」、戻る
id:sumim:20070612:p1 に続く。