【问题标题】:tcl proc using upvar resulting in history(nextid)tcl proc 使用 upvar 导致历史(nextid)
【发布时间】:2013-11-28 07:05:53
【问题描述】:

我遇到了这个奇怪的问题。 我正在使用 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” 有人知道为什么会这样吗?

【问题讨论】:

  • 你可能只想upvar $varName var -- 使用#0 意味着你只能将你的proc与全局变量一起使用,不会看到局部变量。

标签: tcl procedure upvar


【解决方案1】:

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

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

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

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

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多