rubyco の日記 - コルーチン
http://d.hatena.ne.jp/rubyco/20060303/coroutine
コルーチンと call/cc の理解を深めるために Squeak の Smalltalk で Ruby から直訳気味に翻訳してみました。
| 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))することで実行できます。なお、Squeak の Smalltalk には 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 に続く……