tcl proc使用upvar导致历史记录(nextid)

时间:2013-11-28 07:05:54

标签: tcl procedure upvar

我遇到了这个奇怪的问题。 我正在使用tcl 8.3

我在tcl shell中定义了这个proc

% 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)
%

每次我点击换行“Enter”之后 任何人都知道为什么会这样?

1 个答案:

答案 0 :(得分:2)

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

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

  • 始终打印变量名称
  • 如果该变量不存在,则会创建该变量。

因此,如果删除第一个差异(puts),一切都会按预期工作,只是某些库命令可能会调用incr而不是标准incr

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

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