rubyco の日記 - コルーチン


http://d.hatena.ne.jp/rubyco/20060303/coroutine

コルーチンと call/cc の理解を深めるために SqueakSmalltalkRuby から直訳気味に翻訳してみました。

| co |
co := Coroutine generatorSymbol: (#generateIntegerStartingAt:resume:) argument: 0.
5 timesRepeat: [Transcript cr; show: co next]
0
1
2
3
4


クラス「Coroutine」の定義は以下にファイルアウトコードで示します。これをファイルイン(改行が CR のテキストファイル(.st)として保存してファイルリストから file in、あるいは、ワークスペースなどにコピペしたテキストを選択して file it in (cmd/alt + shift + G))することで実行できます。なお、SqueakSmalltalk には call/cc がデフォルトでは提供されていないので、事前に Continuation のインストールが必要です。

Object subclass: #Coroutine
   instanceVariableNames: 'generatorSym argument continue resumeBlock suspend'
   classVariableNames: ''
   poolDictionaries: ''
   category: 'rubyco-Coroutine'!


!Coroutine methodsFor: 'initialization' stamp: 'sumim 3/7/2006 12:13'!
setGeneratorSymbol: genSym argument: arg

   generatorSym := genSym.
   argument := arg.
   continue := nil.
   resumeBlock := [:values | [:cont | continue := cont. suspend value: values] callCC]! !


!Coroutine methodsFor: 'accessing' stamp: 'sumim 3/7/2006 12:13'!
next

   ^ [:sus |
   suspend := sus.
   continue ifNil: [self class perform: generatorSym with: argument with: resumeBlock].
   continue value] callCC! !

"-- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- "!


!Coroutine class methodsFor: 'instance creation' stamp: 'sumim 3/7/2006 12:11'!
generatorSymbol: genSym argument: arg

   ^ self new setGeneratorSymbol: genSym argument: arg; yourself ! !


!Coroutine class methodsFor: 'example-generator' stamp: 'sumim 3/7/2006 12:14'!
generateIntegerStartingAt: iniVal resume: resumeBlock
   "World findATranscript: nil. Transcript clear. Coroutine example"

   | nn |
   nn := iniVal.
   [  resumeBlock value: nn.
      nn := nn + 1] repeat! !


!Coroutine class methodsFor: 'example' stamp: 'sumim 3/7/2006 12:20'!
example
   "World findATranscript: nil. Transcript clear. Coroutine example"

   | co |
   co := Coroutine generatorSymbol: (#generateIntegerStartingAt:resume:) argument: 0.
   5 timesRepeat: [Transcript cr; show: co next]! !


id:sumim:20060308:p1 に続く……