tcl
Prozedurargumente
Suche…
Bemerkungen
Referenzen: proc
Argumenterweiterung (Abschnitt 5)
Eine Prozedur, die keine Argumente akzeptiert
proc myproc {} {
puts "hi"
}
myproc
# => hi
Eine leere Argumentliste (das zweite Argument nach dem Prozedurnamen "myproc") bedeutet, dass die Prozedur keine Argumente akzeptiert.
Eine Prozedur, die zwei Argumente akzeptiert
proc myproc {alpha beta} {
...
set foo $alpha
set beta $bar ;# note: possibly useless invocation
}
myproc 12 34 ;# alpha will be 12, beta will be 34
Wenn die Argumentliste aus Wörtern besteht, sind dies die Namen der lokalen Variablen in der Prozedur, und ihre Anfangswerte entsprechen den Argumentwerten in der Befehlszeile. Die Argumente werden als Wert übergeben, und was mit den Variablenwerten innerhalb der Prozedur geschieht, hat keinen Einfluss auf den Status der Daten außerhalb der Prozedur.
Eine Prozedur, die eine variable Anzahl von Argumenten akzeptiert
### Definition
proc myproc {alpha {beta {}} {gamma green}} {
puts [list $alpha $beta $gamma]
}
### Use
myproc A
# => A {} green
myproc A B
# => A B green
myproc A B C
# => A B C
Dieses Verfahren akzeptiert ein, zwei oder drei Argumente: Die Parameter, deren Namen das erste Element in einer Liste mit zwei Elementen sind, sind optional. Die Parametervariablen ( alpha , beta , gamma ) erhalten so viele Argumentwerte, wie sie zur Verfügung stehen, zugewiesen von links nach rechts. Parametervariablen, die keine Argumentwerte erhalten, erhalten stattdessen ihre Werte vom zweiten Element in der Liste, zu der sie gehörten.
Beachten Sie, dass optionale Argumente am Ende der Argumentliste stehen müssen. Wenn Argument N-1 optional ist, muss auch Argument N optional sein. Wenn der Benutzer in einem Fall das Argument N, aber nicht das Argument N-1 hat , muss der Standardwert des Arguments N-1 beim Aufruf der Prozedur explizit vor dem Argument N angegeben werden.
myproc A B C D
# (ERROR) wrong # args: should be "myproc alpha ?beta? ?gamma?"
Die Prozedur akzeptiert nicht mehr als drei Argumente: Beachten Sie, dass automatisch eine hilfreiche Fehlermeldung mit einer Beschreibung der Argumentsyntax erstellt wird.
Eine Prozedur, die eine beliebige Anzahl von Argumenten akzeptiert
proc myproc args { ... }
proc myproc {args} { ... } ;# equivalent
Wenn der spezielle Parametername args das letzte Element in der Argumentliste ist, erhält er eine Liste aller Argumente an diesem Punkt in der Befehlszeile. Wenn keine vorhanden ist, ist die Liste leer.
Es können Argumente, einschließlich optionaler diejenigen sein, bevor args :
proc myproc {alpha {beta {}} args} { ... }
Dieses Verfahren akzeptiert ein oder mehrere Argumente. Die ersten beiden, falls vorhanden, durch verbraucht werden alpha und beta : Die Liste der den Rest der Argumente wird zugewiesen args .
Eine Prozedur, die einen Namen / eine Referenz auf eine Variable akzeptiert
proc myproc {varName alpha beta} {
upvar 1 $varName var
set var [expr {$var * $alpha + $beta}]
}
set foo 1
myproc foo 10 5
puts $foo
# => 15
In diesem Fall erhält die Prozedur den Namen einer Variablen im aktuellen Gültigkeitsbereich. Innerhalb einer Tcl-Prozedur werden solche Variablen nicht automatisch angezeigt, der Befehl upvar kann jedoch einen Alias für eine Variable einer anderen Stack-Ebene erstellen: 1 bedeutet die Stack-Ebene des Aufrufers, # 0 die globale Ebene usw. Stack - Ebene 1 und der Name foo (aus dem Parameter Variable varName ) lassen upvar diese Variable finden und eine Alias namens erstellen var . Jede Lese- oder Schreiboperation auf var geschieht auch foo in dem Anrufer Stack - Ebene.
Die {*} - Syntax
Manchmal haben Sie eine Liste, aber der Befehl, den Sie die Elemente in der Liste übergeben möchten, fordert, dass jedes Element als separates Argument abgerufen wird. Zum Beispiel: Der Befehl winfo children gibt eine Liste von Fenstern zurück, der destroy jedoch nur eine Folge von Fensternamensargumenten.
set alpha [winfo children .]
# => .a .b .c
destroy $alpha
# (no response, no windows are destroyed)
Die Lösung ist die Verwendung der {*} -Syntax:
destroy {*}[winfo children .]
oder
destroy {*}$alpha
Die {*} -Syntax verwendet den folgenden Wert (kein Leerzeichen dazwischen!) Und fügt die Elemente in diesem Wert so in die Befehlszeile ein, als ob sie einzelne Argumente wären.
Wenn der folgende Wert eine leere Liste ist, wird nichts eingefügt:
puts [list a b {*}{} c d]
# => a b c d
Wenn ein oder mehrere Artikel vorhanden sind, werden diese eingefügt:
puts [list a b {*}{1 2 3} c d]
# => a b 1 2 3 c d