Tcl / Tk:函数内函数的变量范围

时间:2018-11-10 22:03:44

标签: scope tcl upvar

我在Tcl的作用域定义中迷路了。我已经编写了两个proc,并将它们存储在一个文件中,该文件要在我正在编写的另一个脚本中调用。在我的源文件(我将其称为bar.tcl)中,我正在使用upvar在文件的开头定义一堆变量,计划在定义的proc中调用这些变量在bar.tcl中,我将其称为bar1bar2

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

我似乎错误地使用了upvar。这是工作的正确工具吗?我该怎么做才能达到以下目标?

  1. bar.tcl的开头定义一堆要在过程bar1bar2,
  2. 中使用的变量
  3. bar1定义的过程中调用bar2foo.tcl

这是我在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
}

1 个答案:

答案 0 :(得分:2)

bar1内部调用bar2foo,...时,它们的upvar调用将尝试与已执行{的任何proc-local变量链接。 {1}}处理。这是因为没有级别的upvar默认为foo,它表示proc的调用者(即upvar 1)。但是,foo中的目标变量位于全局名称空间中,而不位于bar.tcl中。因此,没有fooalpha链接的变量。

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

#0

这等效于使用upvar "#0" a alpha 以变量别名(global a)为模。