1

我遇到了这个奇怪的问题。我正在使用 tcl 8.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)
%

每次我点击换行符“Enter”之后,有人知道为什么会这样吗?

4

1 回答 1

2

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

incr几乎等于 Tcl 8.3 incr,但有一些区别:

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

因此,如果您删除第一个区别(puts),一切都会按预期工作,只是某些库命令可能会调用您incr的标准incr.

第二个区别现在在核心,IIRC 从 Tcl 8.5 开始,在调用之前已经存在变量并不是必需的incr

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

于 2013-11-28T07:29:39.503 回答