为什么重命名`set`会打破Tcl的交互模式?

时间:2014-02-11 23:37:30

标签: tcl

为什么重命名set会破坏Tcl的交互模式?

info script {}
set tcl_interactive 1
puts [st toupper foo]; # FOO
rename set xyz
puts [st toupper foo]; # Runtime error

(见Ideone.com demo。)

这个问题纯粹是抽象的 - 我注意到这种奇怪的行为,而代码打高尔夫球,并希望更好地理解内部结构。


呃,当我重命名regsub而不是joinsplit时会发生同样的事情。

1 个答案:

答案 0 :(得分:3)

当Tcl处于交互模式时,它会将您键入的命令存储在历史记录中。这是通过history命令实现的,条目放在带有history add子命令的历史记录中。 (还有其他一些事情发生;默认的unknown命令处理程序调用来获取上一个历史记录条目。但它们只与您的问题相关。)

history命令是用Tcl编写的。它implementation显然在set子命令的实现中使用了history add(以及其他内容),但不是joinsplitunknown命令通常用Tcl编写(我没有这么好的链接;它隐藏在init.tcl中)。它使用更多命令,包括regsub(但仅限于复杂的历史记录解析)。

一般来说,Tcl的某些部分是用Tcl编写的,因为在C中编写所有东西都很难维护。如果你不明智地覆盖或删除部分Tcl,事情就会破裂。如果你愿意,你可以自由地打破它们,但是你可以保留它们。 (如果您要替换标准命令并期望仍在运行标准脚本,则最好使用原始名称复制其功能,否则将发生破坏。警告脚本。)