过程中 Tcl 中的变量作用域

variable scope in Tcl inside the procedure

我有以下虚拟程序,

proc main2 {} {          
    set mainVar 100

    proc subproc1 {} {
        puts $mainVar
    }
    subproc1
}

main2

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

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 和数组一起正常工作(以及正确完成这项工作的所有其他细微差别)作为 reader.

的练习。