2016-04-27 11 views
0

ich bei TCL Regel variable Umfangs verwirrt bin, hier ist ein Experiment:TCL Variable Umfang: eine Variable in einem Befehl deklarierte Zugriff

if {2 > 1} { 
    set x 100 
} 
proc p1 {} { 
    set y 200 
} 
puts $x 
p1 
puts $y 

das Skripts Laufen gibt mir:

100 
can't read "y": no such variable 
    while executing 
"puts $y" 

Das verwirrte me: Der Fehler über $ y macht Sinn, weil y innerhalb von proc definiert ist, so dass es außerhalb des proc nicht zugänglich ist. Das Problem ist x, warum ist es zugänglich? Es ist in einem Nesting-Skript des "if" -Befehls definiert.

Von meinem gewohnheitsmäßigen Denken aus C++ Sicht macht es keinen Sinn. Hat TCL eine spezielle Behandlung des Befehls "proc", so dass die in seinem Verschachtelungsscript deklarierten Variablen anders behandelt werden als andere, wie "if", "for" usw.?

BTW Ich weiß, wie es funktioniert, will nur die TCL-Regeln für den variablen Bereich verstehen.

+0

Wenn Sie das Skript Ihres p1-Befehls in einem 'uplevel' ausführen, verhält es sich genauso wie der Befehl 'if'. z.B. 'proc p1 {} {uplevel {...}}'. – Brandin

Antwort

3

Die einzige Festlegung in Tcl ist innerhalb einer proc oder namespaceeval.

Klammern sind Container (eines Skripts oder einer Zeichenfolge), keine Gruppen und definieren keinen neuen Bereich.

Die if Anweisung besteht aus: if gefolgt von einer expr gefolgt von einem Körper. Sowohl expr als auch body sind nur Zeichenfolgen, die einen Ausdruck und ein Skript enthalten.

Denken Sie daran, dass Tcl keine von Algol abgeleitete Sprache ist und Sie keine Regeln von C auf Tcl übertragen können.

Verwandte Themen