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脚本时,部分命令也能被识别
请看下面的示例。
- 在shell交互模式下可以识别部分命令。
Tcl> my_prove
Info: proving started
Info: ....
Info: ....
Tcl> my_pro
Info: proving started
Info: ....
Info: ....
- 源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 在这方面不做任何保证。
我们实现了一些tcl 命令,如果我们在tcl shell 交互模式下在Tcl> 提示符下只键入部分命令,tcl shell 可以识别该命令。但是如果我们把相同的部分命令放在tcl脚本文件中,然后从tclshell中获取脚本,就会报未知命令。并且可以识别tcl sript中的整个命令。
我们如何才能使源代码 tcl 脚本的行为与 shell 交互模式相同?我们期待源码tcl脚本时,部分命令也能被识别
请看下面的示例。
- 在shell交互模式下可以识别部分命令。
Tcl> my_prove Info: proving started Info: .... Info: .... Tcl> my_pro Info: proving started Info: .... Info: ....
- 源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 在这方面不做任何保证。