Posted to tcl by dgp at Mon May 11 13:20:07 GMT 2015view raw
- Now attempt to translate that same example to Itcl:
- package require Itcl 4
- itcl::class juggler {
- variable name
- variable 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
- toss $value
- puts "$name level [info level]"
- return
- }
- rename [info coroutine] {}
- if {[namespace which $target] ne {}} {
- $target ""
- }
- [self] destroy
- }
- }
- coroutine j1 [juggler #auto Larry [
- coroutine j2 [juggler #auto Curly [
- coroutine j3 [juggler #auto Moe j1] toss ]] toss ]] toss Nyuck!Nyuck!Nyuck!
- Running this produces:
- Larry : Nyuck!Nyuck!Nyuck!
- Curly : Nyuck!Nyuck!Nyuck
- Moe : Nyuck!Nyuck!Nyuc
- Larry : Nyuck!Nyuck!Nyu
- cannot yield: C stack busy
- while executing
- "yieldto $target [string replace $value end end]"
- (object "::juggler2" method "::juggler::toss" body line 7)
- invoked from within
- "toss $value"
- (object "::juggler2" method "::juggler::toss" body line 8)
- invoked from within
- "juggler2 toss Nyuck!Nyuck!Nyuck!"
- invoked from within
- "j1 Nyuck!Nyuck!Nyu"
- invoked from within
- "coroutine j1 [juggler #auto Larry [
- coroutine j2 [juggler #auto Curly [
- coroutine j3 [juggler #auto Moe j1] toss ]] toss ]] toss Nyuck!Nyuck!Nyuck!"
- Some NRE support is missing in Itcl.