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.