Posted to tcl by colin at Fri Feb 27 12:47:43 GMT 2009view raw
- package require TclOO
- namespace import oo::*
- class create test {
- variable var
- method froopy {args} {puts stderr "called from coro $args"}
- method start {} {
- puts stderr "start ns:[namespace current] self:[self]"
- proc aproc {args} {
- puts stderr "$args a proc defined in [namespace current] from coro [info coroutine]"
- }
- puts stderr "Commands prior to coro: [info commands [namespace current]::*]"
- coroutine moop ::apply [list args {
- variable var
- aproc Calling
- proc bproc {args} {
- puts stderr "$args b proc defined in [namespace current] from coro [info coroutine]"
- }
- bproc Calling
- puts stderr "Commands in object ns after coro: [info commands [namespace current]::*]"
- puts stderr "Vars in object ns: [info vars [namespace current]::*]"
- puts stderr "var: $var"
- while {1} {
- set args [yield MOOP]
- puts stderr "Coro [info coroutine] called with '$args'" ;# show sign of being called
- my froopy with 'my froopy' ;# call a method from the coro
- }
- } [self]]
- return [self]::moop
- }
- constructor {} {
- set var "this var (v) can be seen from the coro via 'variable' command"
- }
- }
- set x [test new] ;# create the test object
- set coro [$x start] ;# call start to generate the coro
- $coro "calling coro as $coro" ;# call the coro
- ${x}::moop "calling coro explicit '${x}::moop'" ;# alternative way to call coro
- Results:
- start ns:::oo::Obj4 self:::oo::Obj4
- Commands prior to coro: ::oo::Obj4::aproc ::oo::Obj4::my
- Calling a proc defined in ::oo::Obj4 from coro ::oo::Obj4::moop
- Calling b proc defined in ::oo::Obj4 from coro ::oo::Obj4::moop
- Commands in object ns after coro: ::oo::Obj4::aproc ::oo::Obj4::bproc ::oo::Obj4::my ::oo::Obj4::moop
- Vars in object ns: ::oo::Obj4::var
- var: this var (v) can be seen from the coro via 'variable' command
- Coro ::oo::Obj4::moop called with 'calling coro as ::oo::Obj4::moop'
- called from coro with 'my'
- Coro ::oo::Obj4::moop called with 'calling coro explicit '::oo::Obj4::moop''
- called from coro with 'my'
- colin@thighbone:~/Desktop/Work/Wub/Client$ !!
- tclsh test3.tcl
- start ns:::oo::Obj4 self:::oo::Obj4
- Commands prior to coro: ::oo::Obj4::aproc ::oo::Obj4::my
- Calling a proc defined in ::oo::Obj4 from coro ::oo::Obj4::moop
- Calling b proc defined in ::oo::Obj4 from coro ::oo::Obj4::moop
- Commands in object ns after coro: ::oo::Obj4::aproc ::oo::Obj4::bproc ::oo::Obj4::my ::oo::Obj4::moop
- Vars in object ns: ::oo::Obj4::var
- var: this var (v) can be seen from the coro via 'variable' command
- Coro ::oo::Obj4::moop called with 'calling coro as ::oo::Obj4::moop'
- called from coro with 'my froopy'
- Coro ::oo::Obj4::moop called with 'calling coro explicit '::oo::Obj4::moop''
- called from coro with 'my froopy'
Comments
Posted by colin at Fri Feb 27 12:53:30 GMT 2009 [text] [code]
on reflection, I think the line above: return [self]::moop
Posted by colin at Fri Feb 27 12:55:13 GMT 2009 [text] [code]
on reflection, I think the line above: return [self]::moop would be safer as: return [namespace current]::moop, as it's nowhere guaranteed that [namespace current] eq [self] in a method invocation, but it is guaranteed that there will be a namespace (obviously enough)
Posted by dkf at Fri Feb 27 13:14:36 GMT 2009 [text] [code]
Can also use [self namespace]