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

set ::script [info script]

proc add {} {
	while 1 {
		gets stdin e

		set code ""
		foreach i $e {
			append code "$i + "
		}

		set code [string trimright $code "+ "]
	
		puts stdout [expr $code]
	}
}

proc start-add {} {
	global script

	set pipe [open |[list [info nameofexecutable] $script listen] r+]

	return $pipe
}

proc eval-stdin {} {
	uplevel #0 [gets stdin]
}

proc main {argc argv} {
	if {1 == $argc} {
		if {[lindex $argv 0] eq "listen"} {
			add
			exit 0
		}
	}

	set adders [list [start-add] [start-add] [start-add]]

	set n 1
	foreach a $adders {
		puts $a [list $n $n]
		flush $a
		puts "SENT TO:$a"
		incr n
	}
	
	foreach a $adders {
		puts RESULTS:[gets $a]
	}

	set n -1
	foreach a $adders {
		puts $a [list $n $n]
		flush $a
		incr n -1
	}

	foreach a $adders {
		puts RESULTS:[gets $a]
	}

	fileevent stdin readable [list eval-stdin]
	vwait until_exit
}

main $::argc $::argv