Tcl/Tk:函数内函数的变量作用域
Tcl/Tk: scope of variables for a function within a function
我迷失了 Tcl 中的范围变量。我已经编写了两个过程并将其存储在一个文件中,我想在我正在编写的另一个脚本中调用该文件。在我的源文件(我称之为 bar.tcl
)中,我使用 upvar
在我的文件开头定义了一堆变量,我计划在我定义的过程中调用这些变量在 bar.tcl
内,我称之为 bar1
和 bar2
我想从 foo.tcl
中的代码调用 bar.tcl
中的函数。如果我只是与 tclsh 中的 bar.tcl 交互,我的函数工作正常,但是一旦我从 foo.tcl 中的函数中调用 bar1 或 bar2,我就会收到错误 can't read "alpha": no such variable
看来我使用 upvar
不正确。这甚至是完成这项工作的正确工具吗?我该怎么做才能实现以下目标?
- 在
bar.tcl
的开头定义一堆变量,我想在 bar1
和 bar2,
和 两个过程中使用
- 从
foo.tcl
中定义的过程中调用 bar1
和 bar2
这是我在 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
中调用 bar1
、bar2
、...时,它们的 upvar
调用将尝试 link已执行 foo
过程的局部变量。这是因为没有级别的 upvar
默认为 upvar 1
,它表示过程的调用者(即 foo
)。但是,bar.tcl
中的目标变量驻留在全局命名空间中,而不是 foo
中。因此,不存在由 alpha
、bravo
编辑的变量 link。
将出现的 upvar
重写为 upvar #0 ...
,其中 #0
表示全局顶级命名空间,例如:
upvar "#0" a alpha
这相当于使用 global a
模变量别名 (alpha
)。
我迷失了 Tcl 中的范围变量。我已经编写了两个过程并将其存储在一个文件中,我想在我正在编写的另一个脚本中调用该文件。在我的源文件(我称之为 bar.tcl
)中,我使用 upvar
在我的文件开头定义了一堆变量,我计划在我定义的过程中调用这些变量在 bar.tcl
内,我称之为 bar1
和 bar2
我想从 foo.tcl
中的代码调用 bar.tcl
中的函数。如果我只是与 tclsh 中的 bar.tcl 交互,我的函数工作正常,但是一旦我从 foo.tcl 中的函数中调用 bar1 或 bar2,我就会收到错误 can't read "alpha": no such variable
看来我使用 upvar
不正确。这甚至是完成这项工作的正确工具吗?我该怎么做才能实现以下目标?
- 在
bar.tcl
的开头定义一堆变量,我想在bar1
和bar2,
和 两个过程中使用
- 从
foo.tcl
中定义的过程中调用
bar1
和 bar2
这是我在 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
中调用 bar1
、bar2
、...时,它们的 upvar
调用将尝试 link已执行 foo
过程的局部变量。这是因为没有级别的 upvar
默认为 upvar 1
,它表示过程的调用者(即 foo
)。但是,bar.tcl
中的目标变量驻留在全局命名空间中,而不是 foo
中。因此,不存在由 alpha
、bravo
编辑的变量 link。
将出现的 upvar
重写为 upvar #0 ...
,其中 #0
表示全局顶级命名空间,例如:
upvar "#0" a alpha
这相当于使用 global a
模变量别名 (alpha
)。