【问题标题】:variable scope in Tcl inside the procedure过程中 Tcl 中的变量范围
【发布时间】:2017-08-24 10:33:10
【问题描述】:

我有下面的虚拟程序,

proc main2 {} {          
    set mainVar 100

    proc subproc1 {} {
        puts $mainVar
    }
    subproc1
}

main2

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

【问题讨论】:

    标签: scope tcl proc


    【解决方案1】:

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

    【讨论】:

      猜你喜欢
      • 2012-06-23
      • 1970-01-01
      • 2014-09-20
      • 1970-01-01
      • 1970-01-01
      • 2011-11-08
      • 1970-01-01
      • 1970-01-01
      • 2021-11-12
      相关资源
      最近更新 更多