程序内部的Tcl中的变量范围

时间:2017-08-24 10:33:10

标签: scope tcl proc

我有以下虚拟程序,

proc main2 {} {          
    set mainVar 100

    proc subproc1 {} {
        puts $mainVar
    }
    subproc1
}

main2

它抛出错误无法读取“mainVar”:没有这样的变量。我的问题是,如果我在proc中声明一个变量(即mainVar),那个变量应该在该proc中的任何地方都可以访问吗?为什么它不能在mainproc proc中声明的另一个proc中访问?请详细说明这个

1 个答案:

答案 0 :(得分:3)

Tcl的程序不嵌套;根本没有共享范围。在另一个过程中声明一个过程的主要原因是你在外部过程中进行某种代码生成(无论是名称,变量列表还是正文)。

现在,您可以模拟这样的只读版本(简化版本;全服务版本更复杂):

proc closure {name arguments body} {
    set vars [uplevel 1 {info locals}]
    set prologue {}
    foreach v $vars {
        upvar 1 $v var
        append prologue [list set $v $var] ";"
    }
    uplevel 1 [list proc $name $arguments $prologue$body]
}

proc main2 {} {
    set mainVar 100

    closure subproc1 {} {
        puts $mainVar
    }
    subproc1
}

main2

我将使global和数组(以及正确完成此工作的所有其他细微差别)正确地作为读者练习。