Tclsh 只能支持用户键入部分 tcl 命令,但不支持 Tcl 脚本

Tclsh can support user only type partial tcl command, but Tcl script not support

我们实现了一些tcl 命令,如果我们在tcl shell 交互模式下在Tcl> 提示符下只键入部分命令,tcl shell 可以识别该命令。但是如果我们把相同的部分命令放在tcl脚本文件中,然后从tclshell中获取脚本,就会报未知命令。并且可以识别tcl sript中的整个命令。

我们如何才能使源代码 tcl 脚本的行为与 shell 交互模式相同?我们期待源码tcl脚本时,部分命令也能被识别

请看下面的示例。

  1. 在shell交互模式下可以识别部分命令。
Tcl> my_prove
Info: proving started
Info: ....
Info: ....

Tcl> my_pro
Info: proving started
Info: ....
Info: ....
  1. 源run.tcl脚本时无法识别部分命令。

a) run.tcl

   setup_design
   my_prove
   my_pro

b) 获取脚本 run.tcl

Tcl> source run.tcl
$inside source$$> setup_desgin
    Design setup...
    Done
$inside source$$> my_prove
    Info: proving started
    Info: ....
    Info: ....
$inside source$$> ::unknown my_pro
    invalid command name "my_pro"

Tcl 在 unknown 过程中实现了部分命令名称扩展(以及许多其他东西),并且只在交互模式下打开它。通常强烈建议在脚本中使用完整的命令名称;那更有可能是可靠的。

如果你想启用它,我认为你不应该, 这样做(这个版本使用 tailcall 所以至少需要 Tcl 8.6):

rename unknown _standard_unknown
proc unknown args {
    set cmd [lindex $args 0]
    set matches [uplevel 1 [list info commands $cmd*]]
    # If there is a unique match, use it
    if {[llength $matches] == 1} {
        lset args 0 [lindex $matches 0]
        tailcall {*}$args
    }
    tailcall _standard_unknown {*}$args
}

理论上,您也可以将 tcl_interactive 全局设置为任何真值(例如 1)以启用扩展。但是,这样做可能还会导致其他不需要的行为; Tcl 在这方面不做任何保证。