非交互式 tclsh 可以交互式吗?

Can a non-interactive tclsh be made interactive?

提问人:screwtop 提问时间:11/2/2023 更新时间:11/3/2023 访问量:36

问:

在开发 Tcl 代码时,我发现 tclsh 的交互工具非常有用,我经常会以交互方式启动 tclsh,从文件中编写代码,然后从那里继续运行和调试。source

我想知道的是:有没有办法从非交互式的 tclsh 实例(比如因为它是使用脚本文件参数运行的)放入交互式 shell?我知道有一个变量,可以设置,但这样做不会导致交互式提示。tcl_interactive

我希望能够在相同的进程和终端中做到这一点(尽管 Tkcon 当然很棒)。

(我猜棘手的事情是将 Tcl 的输入从指定的脚本文件切换到终端/pty 的 stdin。这可能需要 Expect 的魔力才能发挥作用。我也考虑过一些诡计,但那会变得很混乱;我希望让您在命令行或通过环境变量指定一个 rc 文件。.tclshrctclsh

调试 TCL STDIN 交互式 TCLSH

评论


答:

0赞 Cyan Ogilvie 11/2/2023 #1

您可以启动 tclreadline REPL:

proc poll {} {
    puts "doing something"
    if {[incr ::pollnum] == 3} {
        package require tclreadline
        tclreadline::Loop
    }
    after 2000 poll
}

poll

vwait forever
doing something
doing something
doing something
tclsh8.7 [/tmp] puts "hello, repl"
hello, repl
tclsh8.7 [/tmp] 
2赞 Donal Fellows 11/3/2023 #2

在所有 Unix 平台上,您可以通过打开 .然后,您可以实现自己的 REPL。执行此操作的代码将如下所示。/dev/tty

set tty [open /dev/tty r+]
fconfigure $tty -buffering none
set buffer ""
while {![eof $tty]} {
    puts -nonewline $tty "> "
    gets $tty line
    append buffer $line "\n"
    if {[info complete $buffer]} {
        try {
            # Or uplevel or interp eval
            eval $buffer
        } on ok result {
            if {$result ne ""} {puts $tty $result}
        } on error {msg opt} {
            puts stderr [dict get $opt -errorinfo]
        }
        set buffer ""
    }
}