Posted to tcl by hypnotoad at Wed Dec 11 20:03:50 GMT 2019view pretty

# Master.tcl
set here [file dirname [file normalize [info script]]]
puts "I AM $here"

lassign [chan pipe] slaveout pipein

puts "STARTING SLAVE"
set slavein [open [list | [info nameofexecutable] [file join $here slave.tcl] ] r+]
set slaveout $slavein

proc SEND {command} {
  global slavein slaveout
  puts "M> $command"
  chan puts $slavein $command
  #catch {chan flush $slavein}
  gets $slaveout r
  puts "M< $r"
  return $r
}
chan configure $slaveout -buffering line

puts "SENDING COMMAND"
SEND {expr 2+2}
SEND {clock seconds}

after 2000
SEND {expr 2+6}
SEND {clock seconds}
after 2000
SEND {exit}
exit 0

# slave.tcl
set here [file dirname [file normalize [info script]]]
set flog [open [file join $here log] w]
chan configure $flog -buffering line
puts $flog "STARTED"
chan configure stdin -buffering line
chan configure stdout -buffering line

while 1 {
  try {
    puts $flog "S WAIT"
    if {[gets stdin line]<=0} {
      exit 1
    }
    puts $flog "[clock seconds] S< $line"
    set r [eval $line]
    puts $flog "[clock seconds] S> $r"
    puts stdout $r
  } on error {er errdat} {
    puts $flog [dict get $errdat -errorinfo]
  }
}