tcl proc使用upvar生成历史记录(nextid)

tcl proc使用upvar生成历史记录(nextid),tcl,procedure,upvar,Tcl,Procedure,Upvar,我有个奇怪的问题。 我正在使用TCL8.3 在我在tcl shell中定义这个过程之后 % proc incr { varName {amount 1}} { puts $varName upvar #0 $varName var puts $varName if {[info exists var]} { set var [expr $var + $amount] } else { set var $amount }

我有个奇怪的问题。 我正在使用TCL8.3

在我在tcl shell中定义这个过程之后

% proc incr { varName {amount 1}} {
    puts $varName
    upvar #0 $varName var
    puts $varName
    if {[info exists var]} {
       set var [expr $var + $amount]
    } else {
       set var $amount
    }
    return $var
}
我一直在

%
history(nextid)
history(nextid)
history(oldest)
history(oldest)
%
每次我点击新行“回车”之后
有人知道为什么会发生这种情况吗?

因为历史管理是用Tcl本身编写的,并且使用了
incr

您的
incr
几乎等同于Tcl 8.3的
incr
,但存在一些差异:

  • 始终打印变量的名称
  • 如果变量不存在,将创建该变量
因此,如果删除第一个差异(
put
),一切都将按预期工作,只是一些库命令可能会调用您的
incr
,而不是标准的
incr

第二个区别是现在的核心,IIRC从Tcl 8.5开始。变量已经存在或调用
incr


简言之:你做的很好。但是不要期望成为唯一一个调用标准命令的人。

您可能只想
upvar$varName var
——使用
#0
意味着您只能对全局变量使用proc,而不会看到局部变量。