Posted to tcl by aspect at Fri Apr 24 04:11:25 GMT 2015view raw

  1. package require pkg
  2. package require chans
  3.  
  4. pkg -export {} repl {
  5.  
  6. proc tcp {port {myaddr 127.0.0.1}} {
  7. debug log {REPL listening on $myaddr:$port}
  8. socket -server [namespace which accept] -myaddr $myaddr $port
  9. }
  10.  
  11. proc accept {chan addr port} {
  12. debug log {REPL connected from $addr:$port}
  13. fconfigure $chan -blocking 0 -buffering none -encoding utf-8
  14. coroutine tcp:$addr:$port chan $chan
  15. }
  16.  
  17. proc chan {chan {outchan ""} {errchan ""}} {
  18. if {$outchan eq ""} {set outchan $chan}
  19. if {$errchan eq ""} {set errchan $outchan}
  20. set iter [chans::iterobj new $chan]
  21. try {
  22. while {1} {
  23. puts -nonewline $outchan "% "
  24. set cmd [$iter next]
  25. try {
  26. set res [uplevel #0 $cmd]
  27. } on ok {} {
  28. puts $outchan $res
  29. } on error {e o} {
  30. puts $errchan "ERROR: $e"
  31. }
  32. }
  33. } finally {
  34. $iter destroy
  35. }
  36. }
  37.  
  38. }
  39.