我在Tcl的作用域定义中迷路了。我已经编写了两个proc,并将它们存储在一个文件中,该文件要在我正在编写的另一个脚本中调用。在我的源文件(我将其称为bar.tcl
)中,我正在使用upvar
在文件的开头定义一堆变量,计划在定义的proc中调用这些变量在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
的开头定义一堆要在过程bar1
和bar2,
和bar1
定义的过程中调用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
}
答案 0 :(得分:2)
从bar1
内部调用bar2
,foo
,...时,它们的upvar
调用将尝试与已执行{的任何proc-local变量链接。 {1}}处理。这是因为没有级别的upvar
默认为foo
,它表示proc的调用者(即upvar 1
)。但是,foo
中的目标变量位于全局名称空间中,而不位于bar.tcl
中。因此,没有foo
,alpha
链接的变量。
将您出现的bravo
重写为upvar
,其中upvar #0 ...
表示全局的顶级命名空间,例如:
#0
这等效于使用upvar "#0" a alpha
以变量别名(global a
)为模。