2017-08-24 1 views
0

J'ai ci-dessous le programme fictif,portée variable Tcl dans la procédure

proc main2 {} {   
    set mainVar 100 

    proc subproc1 {} { 
     puts $mainVar 
    } 
    subproc1 
} 

main2 

il renvoie une erreur ne peut pas lire « mainVar »: pas de telle variable. ma question est si je déclare une variable (c'est-à-dire mainVar) dans proc n'est pas cette variable devrait être accessible partout dans ce proc? pourquoi il ne peut pas être accessible dans un autre proc qui est déclaré à l'intérieur de mainproc proc? s'il vous plaît mettez un peu de lumière sur ce

Répondre

3

Les procédures de Tcl ne nichent pas; il n'y a pas de portée partagée du tout. La raison principale pour déclarer une procédure dans un autre est si vous faites une sorte de génération de code dans la procédure externe (que ce soit le nom, la liste des variables ou le corps).

Maintenant, vous pouvez simuler une lecture seule version comme ceci (version simplifiée, une variante à service complet est beaucoup plus complexe):

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 

Je vais laisser faire correctement travailler avec global et tableaux (ainsi que toutes les autres nuances de faire ce travail correctement) comme des exercices pour le lecteur.