Posted to tcl by dgp at Mon May 11 13:17:17 GMT 2015view raw
- The coroutine.n documentation contains a "juggler" example
- to illustrate use of [yieldto]. Here's a modification using
- TclOO objects instead of a proc, and adding a few puts to
- track the control flow:
- oo::class create juggler {
- variable name target
- constructor {_n _t} {
- set name $_n
- set target $_t
- }
- destructor {puts DIE:$name}
- method toss {{value ""}} {
- if {[llength [info level 0]] == 2} {
- set value [yield [info coroutine]]
- }
- if {$value ne ""} {
- puts "$name : $value"
- lassign [yieldto $target [string replace $value end end]] value
- my toss $value
- puts "$name level [info level]"
- return
- }
- rename [info coroutine] {}
- if {[namespace which $target] ne {}} {
- $target ""
- }
- [self] destroy
- }
- }
- coroutine j1 [juggler new Larry [
- coroutine j2 [juggler new Curly [
- coroutine j3 [juggler new Moe j1] toss ]] toss ]] toss Nyuk!Nyuk!Nyuk!
- Running it produces:
- Larry : Nyuk!Nyuk!Nyuk!
- Curly : Nyuk!Nyuk!Nyuk
- Moe : Nyuk!Nyuk!Nyu
- Larry : Nyuk!Nyuk!Ny
- Curly : Nyuk!Nyuk!N
- Moe : Nyuk!Nyuk!
- Larry : Nyuk!Nyuk
- Curly : Nyuk!Nyu
- Moe : Nyuk!Ny
- Larry : Nyuk!N
- Curly : Nyuk!
- Moe : Nyuk
- Larry : Nyu
- Curly : Ny
- Moe : N
- DIE:Moe
- Moe level 5
- Moe level 4
- Moe level 3
- Moe level 2
- Moe level 1
- DIE:Curly
- Curly level 5
- Curly level 4
- Curly level 3
- Curly level 2
- Curly level 1
- DIE:Larry
- Larry level 5
- Larry level 4
- Larry level 3
- Larry level 2
- Larry level 1