2017-08-24 89 views
0

我有以下伪程序里面,可变范围的程序

proc main2 {} {   
    set mainVar 100 

    proc subproc1 {} { 
     puts $mainVar 
    } 
    subproc1 
} 

main2 

它引发错误无法读取“mainVar”:没有这样的变量。我的问题是,如果我在proc中声明一个变量(即mainVar)不是应该可以在该proc中的任何位置访问该变量吗?为什么它不能在mainproc proc中声明的另一个proc中访问?请在这里写一些东西

回答

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