为什么重命名“set”会破坏Tcl';什么是互动模式?

为什么重命名“set”会破坏Tcl';什么是互动模式?,tcl,Tcl,为什么重命名set会打破Tcl的交互模式 info script {} set tcl_interactive 1 puts [st toupper foo]; # FOO rename set xyz puts [st toupper foo]; # Runtime error (见附件。) 这个问题纯粹是抽象的——我在打代码高尔夫时注意到了这种奇怪的行为,我想更好地理解其内部结构 呃,当我重命名regsub,但不是join或split时,也会发生同样的情况。当Tcl处于交互模式时,它会将

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

info script {}
set tcl_interactive 1
puts [st toupper foo]; # FOO
rename set xyz
puts [st toupper foo]; # Runtime error
(见附件。)

这个问题纯粹是抽象的——我在打代码高尔夫时注意到了这种奇怪的行为,我想更好地理解其内部结构



呃,当我重命名
regsub
,但不是
join
split
时,也会发生同样的情况。当Tcl处于交互模式时,它会将您键入的命令存储在历史记录中。这是通过命令实现的,使用
history add
子命令将条目放置在历史记录中。(还有其他一些事情正在进行;默认的命令处理程序调用以获取类似于上一个历史记录条目的内容。但它们与您的问题无关。)

history
命令是用Tcl编写的。显然,它在
历史添加
子命令的实现中使用了
(除其他外),而不是
连接
拆分
unknown
命令通常也是用Tcl编写的(我没有这么好的链接;它隐藏在
init.Tcl
中)。它使用更多的命令,包括
regsub
(但仅在复杂的历史解析中)


一般来说,Tcl的某些部分是用Tcl编写的,因为用C编写所有东西都很难维护。如果您不明智地覆盖或删除了Tcl的部分内容,事情就会破裂。如果你想的话,你可以随意打破它们,但是你可以保留碎片。(如果您正在替换一个标准命令,并且希望仍在运行标准脚本,则最好将其功能与原始名称非常接近地复制,否则会发生中断。请注意scriptor。)

这里的问题不是
历史记录
,而是
未知
。未知调用
set
(不存在)->调用
Unknown
@JohannesKuhn,但是
history
也调用
set
,并且键入的每个命令都以交互方式通过
Tcl\u RecordAndEval
,这些天只执行
history add
调用。
unknown
中的循环在此之后发生…