我对Tcl中的范围变量感到迷茫。我已经编写了两个procs,并将其存储在一个文件中,我想调用另一个正在编写的脚本。在我的源文件(我将称为bar.tcl)中,我在文件开始时使用upvar定义了一堆变量,我计划在我在bar.tcl中定义的过程中调用这些变量,这就是我将调用的bar1和bar2
我想从我在bar.tcl中的代码中调用foo.tcl中的函数。如果我只是在tclsh中与bar.tcl交互,那么我的函数工作得很好,但是一旦我在foo.tcl函数中调用了bar1或bar2,我就会得到一个错误can't read "alpha": no such variable
看来我在用upvar不正确。这是适合这项工作的工具吗?我怎样才能做到以下几点呢?
bar.tcl开头定义一组变量,我希望在procs、bar1和bar2,以及bar1中定义的procs中调用bar2和foo.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
}发布于 2018-11-10 23:58:06
当bar1,bar2 .在foo中调用,它们的upvar调用将尝试链接到执行的foo proc的任何proc局部变量。这是因为没有级别的upvar默认为upvar 1,它表示proc的调用方(即foo)。但是,bar.tcl中的目标变量驻留在全局命名空间中,而不是在foo中。因此,不存在由alpha、bravo链接的变量。
将upvar重写为upvar #0 ...,#0表示全局顶级命名空间,例如:
upvar "#0" a alpha这相当于使用global a模块--一个变量别名(alpha)。
https://stackoverflow.com/questions/53243873
复制相似问题