Posted to tcl by colin at Thu Apr 15 03:00:39 GMT 2010view raw

  1. Assume a Coroutine which generates a command taking multiple args, and a coroutine as we have it implemented:
  2.  
  3. # Coroutine in coroutine:
  4. proc Coroutine {name command args} {
  5. set ns [namespace qualifiers $name]
  6. if {$ns eq ""} {
  7. set ns [uplevel 1 {namespace current}]
  8. }
  9. set name [namespace tail $name]
  10.  
  11. set coco [::coroutine ${ns}::C$name $command {*}args]
  12. trace add command ${ns}::_C$name delete "rename ${ns}::name {}"
  13. proc ${ns}::$name {args} {
  14. [lindex [info level 0] 0] $args
  15. }
  16. }
  17.  
  18. proc coyield {args} {
  19. return [::yield $args]
  20. }
  21.  
  22. proc yieldv {value args} {
  23. uplevel 1 [::yield $value] {*}$args
  24. }
  25.  
  26. # coroutine in cocoroutine:
  27. proc coroutine {name command args} {
  28. set ns [namespace qualifiers $name]
  29. if {$ns eq ""} {
  30. set ns [uplevel 1 {namespace current}]
  31. }
  32. set name [namespace tail $name]
  33.  
  34. Coroutine ${ns}::$name $command {*}$args
  35. }
  36.  
  37. proc ::yield2 {value} {
  38. return [lindex [::yield $value] 0]
  39. }