尝试重命名set
功能时,
我收到了错误too many nested evaluations (infinite loop?)
(见下文)。
也许是因为rename
在内部使用set
。有没有办法覆盖这种行为?
rename set Set
too many nested evaluations (infinite loop?)
while executing
"set cmd [lindex $args 0]"
(procedure "::unknown" line 8)
invoked from within
"set cmd [lindex $args 0]"
(procedure "::unknown" line 8)
invoked from within
"set cmd [lindex $args 0]"
procedure "::unknown" line 8
...
答案 0 :(得分:3)
rename
命令是Tcl的内置命令,不依赖于任何其他命令。但是,交互式评估循环在其历史管理代码中确实使用set
,unknown
命令处理命令名称未解析为现有命令时要执行的操作。这会触发一个无限循环,因为当set
不存在时要处理该怎么做,需要set
作为处理代码的一部分;堆栈保护代码(参见interp recursionlimit
)最终导致事情失败......
最简单的解决方法是确保将{em>某些保留在名为set
的位置。
# Make our replacement
proc replacement_set {varName {value ""}} {
# This is 8.6-specific code, but you can do other equivalent things
tailcall old_set {*}[lrange [info level 0] 1 end]
}
# Swap things in, with both renames on the same line...
rename set old_set; rename replacement_set set
请注意,您不需要在脚本中小心谨慎。