有没有办法重命名 'set'

Is there any way to rename 'set'

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

rename命令是Tcl的内置命令,不依赖于任何其他命令。然而,交互式评估循环在其历史管理代码中确实使用了相当多的 setunknown 命令也是如此,该命令处理当命令名称未解析为现有命令时要执行的操作。这会触发一个无限循环,因为当 set 不存在时处理要做什么需要 set 作为处理代码的一部分出现;堆栈保护代码(参见 interp recursionlimit)最终会把事情搞砸……

最简单的解决方法是确保在名为 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

请注意,您不需要在脚本中那么小心。