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

package require pkg
package require chans

pkg -export {} repl {

    proc tcp {port {myaddr 127.0.0.1}} {
        debug log {REPL listening on $myaddr:$port}
        socket -server [namespace which accept] -myaddr $myaddr $port
    }

    proc accept {chan addr port} {
        debug log {REPL connected from $addr:$port}
        fconfigure $chan -blocking 0 -buffering none -encoding utf-8
        coroutine tcp:$addr:$port chan $chan
    }

    proc chan {chan {outchan ""} {errchan ""}} {
        if {$outchan eq ""} {set outchan $chan}
        if {$errchan eq ""} {set errchan $outchan}
        set iter [chans::iterobj new $chan]
        try {
            while {1} {
                puts -nonewline $outchan "% "
                set cmd [$iter next]
                try {
                    set res [uplevel #0 $cmd]
                } on ok {} {
                    puts $outchan $res
                } on error {e o} {
                    puts $errchan "ERROR: $e"
                }
            }
        } finally {
            $iter destroy
        }
    }

}