Was macht {*} in TCL?

8

Ich habe TCL benutzt, aber diese Konstruktion stopft mich.

Wenn $ res="Tabelle existiert nicht", was wird der folgende zurückgeben?

%Vor%

Ich weiß, was [list [list $res]] tun würde, aber die zusätzliche {*} verblüfft mich nur.

Danke für Ihre Hilfe.

    
Noah 26.02.2011, 00:28
quelle

3 Antworten

7
  

Wenn $ res="Tabelle existiert nicht", was wird der folgende zurückgeben?

%Vor%

Wissen Sie zuerst, dass [list {*}…] ein Konstrukt ist, das eine Liste der Wörter in den Auslassungspunkten (den Inhalt der res -Variablen in Ihrem Fall) zurückgibt. Es passiert , dass in Ihrem Fall der Nettoeffekt nichts ist, da die Eingabezeichenfolge tatsächlich auch eine wohlgeformte Liste ist. Das wird dann zu einem einzelnen Argument für das äußere list und so erhalten wir eine Ein-Element-Liste als Ergebnis, deren Element eine Liste der Wörter Table , does , not und exist in dieser Reihenfolge enthält , zB {Table does not exist} .

Hinweise zur Erweiterung

Die Liste der erweiterten Wortform ist nützlich für die Verkettung von Listen; Der Befehl concat macht etwas Ähnliches (aber nicht identisch; es gibt einige historische Seltsamkeiten, die in den Befehl concat involviert sind). Daher würden Sie zwei Listen wie folgt verketten:

%Vor%

Beachten Sie auch, dass die Erweiterung (eingeführt in Tcl 8.5) wahre Syntax ist, was in Tcl eine sehr ungewöhnliche Sache ist. Das {*} ändert die Art der folgenden Ersetzung, so dass es mehrere Wörter statt nur eins ergibt. Während es möglich ist, ohne es zu tun, ist es tatsächlich bemerkenswert schwierig, richtig zu werden. Zum Beispiel ohne das obige wäre:

%Vor%

Die Einführung der Erweiterung hat die Anzahl der Aufrufe an eval , die in den meisten Tcl-Codes benötigt werden, stark reduziert (ein Vorteil, da es schwer war, richtig zu schreiben; viele Programmierer waren von der Schwierigkeit überrascht). Dies hat sich in der Praxis mit dem Befehl exec besonders bewährt; es macht das Arbeiten mit glob und auto_execok viel einfacher:

%Vor%

Pfui. Der letzte war ein bisschen verrückt, um in nicht-erweiterter Form zu schreiben, obwohl ich weiß, was ich mache. (Die falsche Version ist falsch, weil sie auseinander fällt, wenn $arg1 Tcl Meta-Zeichen enthält ...)

    
Donal Fellows 28.02.2011, 01:17
quelle
5

Es ist auf der Tcl-Handbuchseite dokumentiert. Es wird auf dem Tcl-Wiki diskutiert. Es wurde in die Sprache in TIP 293 eingeführt (sein Vorgänger war TIP 157 , wo Sie lernen können, wie es funktioniert).

Im Wesentlichen wird {*}$res die Zeichenfolge in ihre durch Leerzeichen getrennten Wörter aufteilen. Also verhält sich [list {*}$res] genauso wie [split $res] (in diesem Fall).

Das Endergebnis ist eine Liste mit einem Element, der Liste der Wörter in $ res.

    
glenn jackman 26.02.2011 12:20
quelle
3

Ja, ich finde diese Konstruktion immer auch lästig. Es wurde als expand bezeichnet und dann wurde es clever in {*} umbenannt (sehr einprägsam!). Jedenfalls habe ich gesehen, dass es verwendet wurde, um eine Liste zu erweitern, um den Listeninhalt verfügbar zu machen.

Siehe dieses Beispiel für eine Idee, wie es funktioniert:

%Vor%     
TrojanName 26.02.2011 01:20
quelle

Tags und Links