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



我迷上了Tcl中的作用域变量。我已经写了两个proc,并存储在一个文件中,我想在我正在写的另一个脚本中调用它。在我的源文件(我将称之为bar.tcl(中,我使用upvar在文件的开头定义一组变量,我计划在bar.tcl中定义的proc中调用这些变量,我将称其为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. foo.tcl中定义的进程中调用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
}

bar1bar2。。。从foo中调用,它们的upvar调用将尝试与已执行的fooproc的任何proc本地变量链接。这是因为没有级别的upvar默认为upvar 1,表示进程的调用方(即foo(。但是,bar.tcl中的目标变量位于全局命名空间中,而不是foo中。因此,不存在由alphabravo链接的变量。

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

upvar "#0" a alpha

这相当于使用global a对变量别名(alpha(进行模运算。

最新更新