首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Tcl/Tk:函数中函数的变量范围

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

Stack Overflow用户
提问于 2018-11-10 22:03:43
回答 1查看 368关注 0票数 0

我对Tcl中的范围变量感到迷茫。我已经编写了两个procs,并将其存储在一个文件中,我想调用另一个正在编写的脚本。在我的源文件(我将称为bar.tcl)中,我在文件开始时使用upvar定义了一堆变量,我计划在我在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开头定义一组变量,我希望在procs、bar1bar2,以及
  2. 从在bar1中定义的procs中调用bar2foo.tcl

这是我在foo.tcl中的代码

代码语言:javascript
复制
# 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中的代码

代码语言:javascript
复制
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
}
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2018-11-10 23:58:06

bar1bar2 .在foo中调用,它们的upvar调用将尝试链接到执行的foo proc的任何proc局部变量。这是因为没有级别的upvar默认为upvar 1,它表示proc的调用方(即foo)。但是,bar.tcl中的目标变量驻留在全局命名空间中,而不是在foo中。因此,不存在由alphabravo链接的变量。

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

代码语言:javascript
复制
upvar "#0" a alpha

这相当于使用global a模块--一个变量别名(alpha)。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/53243873

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档