有没有办法重命名'set'

时间:2015-03-16 13:47:19

标签: tcl

尝试重命名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
    ...

1 个答案:

答案 0 :(得分:3)

rename命令是Tcl的内置命令,不依赖于任何其他命令。但是,交互式评估循环在其历史管理代码中确实使用setunknown命令处理命令名称未解析为现有命令时要执行的操作。这会触发一个无限循环,因为当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

请注意,您不需要在脚本中小心谨慎。