Tcl/Tk:函数内函数的变量作用域

Tcl/Tk: scope of variables for a function within a function

我迷失了 Tcl 中的范围变量。我已经编写了两个过程并将其存储在一个文件中,我想在我正在编写的另一个脚本中调用该文件。在我的源文件(我称之为 bar.tcl)中,我使用 upvar 在我的文件开头定义了一堆变量,我计划在我定义的过程中调用这些变量在 bar.tcl 内,我称之为 bar1bar2

我想从 foo.tcl 中的代码调用 bar.tcl 中的函数。如果我只是与 tclsh 中的 bar.tcl 交互,我的函数工作正常,但是一旦我从 foo.tcl 中的函数中调用 bar1 或 bar2,我就会收到错误 can't read "alpha": no such variable

看来我使用 upvar 不正确。这甚至是完成这项工作的正确工具吗?我该怎么做才能实现以下目标?

  1. bar.tcl 的开头定义一堆变量,我想在 bar1bar2,
  2. 两个过程中使用
  3. foo.tcl
  4. 中定义的过程中调用 bar1bar2

这是我在 foo.tcl 中的代码:

# foo.tcl
source bar.tcl

proc foo {fooValues} {
    foreach fooValue $fooValues {
        set myNewValue [bar1 $fooValue]
        return $myNewValue
    }
}

set myOldValues {5 10 15 20 25}
foo myOldValues

这是我在 bar.tcl 中的代码:

set a apples
set b bananas
set c cherries
set d dates

proc bar1 {bar} {
    upvar a alpha
    upvar b bravo
    upvar c charlie
    upvar d delta

    set myReturnValue "$bar $alpha $bravo $charlie $delta"
    return $myReturnValue
}

proc bar2 {bar} {
    upvar a alpha
    upvar b bravo
    upvar c charlie
    upvar d delta

    set myReturnValue "$alpha $bravo $charlie $delta $bar"
    return $myReturnValue
}

当从 foo 中调用 bar1bar2、...时,它们的 upvar 调用将尝试 link已执行 foo 过程的局部变量。这是因为没有级别的 upvar 默认为 upvar 1,它表示过程的调用者(即 foo)。但是,bar.tcl 中的目标变量驻留在全局命名空间中,而不是 foo 中。因此,不存在由 alphabravo 编辑的变量 link。

将出现的 upvar 重写为 upvar #0 ...,其中 #0 表示全局顶级命名空间,例如:

upvar "#0" a alpha

这相当于使用 global a 模变量别名 (alpha)。