Posted to tcl by dgp at Mon May 11 13:20:07 GMT 2015view pretty
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.