2017-08-24 103 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和數組(以及所有其他做這項工作的細微差別)作爲讀者的練習。