提问人:screwtop 提问时间:11/2/2023 更新时间:11/3/2023 访问量:36
非交互式 tclsh 可以交互式吗?
Can a non-interactive tclsh be made interactive?
问:
在开发 Tcl 代码时,我发现 tclsh 的交互工具非常有用,我经常会以交互方式启动 tclsh,从文件中编写代码,然后从那里继续运行和调试。source
我想知道的是:有没有办法从非交互式的 tclsh 实例(比如因为它是使用脚本文件参数运行的)放入交互式 shell?我知道有一个变量,可以设置,但这样做不会导致交互式提示。tcl_interactive
我希望能够在相同的进程和终端中做到这一点(尽管 Tkcon 当然很棒)。
(我猜棘手的事情是将 Tcl 的输入从指定的脚本文件切换到终端/pty 的 stdin。这可能需要 Expect 的魔力才能发挥作用。我也考虑过一些诡计,但那会变得很混乱;我希望让您在命令行或通过环境变量指定一个 rc 文件。.tclshrc
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 ""
}
}
上一个:戴尔编程语言的标准输入
评论