Posted to tcl by gps at Fri Apr 10 02:13:14 GMT 2009view raw

  1.  
  2. set ::script [info script]
  3.  
  4. proc add {} {
  5. while 1 {
  6. gets stdin e
  7.  
  8. set code ""
  9. foreach i $e {
  10. append code "$i + "
  11. }
  12.  
  13. set code [string trimright $code "+ "]
  14.  
  15. puts stdout [expr $code]
  16. }
  17. }
  18.  
  19. proc start-add {} {
  20. global script
  21.  
  22. set pipe [open |[list [info nameofexecutable] $script listen] r+]
  23.  
  24. return $pipe
  25. }
  26.  
  27. proc eval-stdin {} {
  28. uplevel #0 [gets stdin]
  29. }
  30.  
  31. proc main {argc argv} {
  32. if {1 == $argc} {
  33. if {[lindex $argv 0] eq "listen"} {
  34. add
  35. exit 0
  36. }
  37. }
  38.  
  39. set adders [list [start-add] [start-add] [start-add]]
  40.  
  41. set n 1
  42. foreach a $adders {
  43. puts $a [list $n $n]
  44. flush $a
  45. puts "SENT TO:$a"
  46. incr n
  47. }
  48.  
  49. foreach a $adders {
  50. puts RESULTS:[gets $a]
  51. }
  52.  
  53. set n -1
  54. foreach a $adders {
  55. puts $a [list $n $n]
  56. flush $a
  57. incr n -1
  58. }
  59.  
  60. foreach a $adders {
  61. puts RESULTS:[gets $a]
  62. }
  63.  
  64. fileevent stdin readable [list eval-stdin]
  65. vwait until_exit
  66. }
  67.  
  68. main $::argc $::argv
  69.