MSW haben Ihnen bereits die richtige Antwort gegeben, aber ich denke, ein wenig mehr Erklärung ist erforderlich, um einige andere Verwirrungen, die Sie basierend auf Ihren Kommentaren haben, zu klären.
Ich werde zuerst Dinge erklären, die Nicht-Tcl-Terminologie verwenden, da ich denke, dass es auf diese Weise weniger verwirrend ist.
In tcl, if
ist keine Aussage. if
ist eine Funktion. Das ist der Grund, warum die öffnende Klammer in der gleichen Zeile sein muss: weil ein Newline die Liste der Argumente zu einer Funktion beendet. Beispiel: Im folgenden Code:
a b c d
e f
Der Tcl-Interpreter sieht zwei Funktionsaufrufe. Die erste Funktion ist a
mit den Argumenten b, c und d und die zweite Funktion e
mit einem einzelnen Argument f. Ebenso im folgenden:
if a
b
Tcl sieht einen Aufruf der Funktion if
mit einem einzigen Argument. Da if
mindestens zwei Argumente erwartet, gibt es (nicht der Interpreter selbst) einen Fehler, der sich über die falsche Anzahl von Argumenten beschwert.
Dies erklärt auch, warum zwischen If und seinem ersten Argument ein Leerzeichen stehen muss. Es ist nur, weil in tcl Namen von Variablen und Funktionen buchstäblich alles enthalten dürfen einschließlich Leerzeichen, Kommas und nicht-druckbare Zeichen wie NUL.
proc a{b} {} {puts HA!}
a{b} ;# <-- prints out HA!
Also, wenn Sie so etwas wie:: Zum Beispiel können Sie eine Funktion a{b}
genannt definieren
if{x} {y}
tcl wird sich beschweren, dass die Funktion if{x}
nicht definiert ist.
if
ist nicht die einzige Sache, die so funktioniert.Tcl hat nicht wirklich Schlüsselwörter, nur eine Standardbibliothek eingebauter Funktionen wie for
, foreach
und while
. Für alle gelten dieselben Regeln.
nicht wirklich wichtig:
Auf einer Seite, die if
Funktion in tcl funktioniert wie der ternäre Operator in C: es einen Wert zurückgibt. In der Tat kann man wie folgt vorgehen:
# It is unfortunate that this "give" function is not built in.
# We use it to return something from if without actually
# calling return:
proc give {x} {return $x}
set something [if {$x} {give "Very true indeed."} {give "Unfortunately false."}]
Sie haben ziemlich viel mit Tcl One True Brace Stil zu verwenden bekommen (obwohl Ihre eigene Einbuchtung Regeln wählen, aber ich ziehe es 3 oder 4 Leerzeichen), da sonst die Sprachanweisungen enden an der ersten Zeilenumbruch. Ihre einzige Alternative ist es, zusätzliche Backslashes am Ende der Zeilen hinzuzufügen, die Sie fortsetzen möchten, aber ich denke, das ist * far * mehr. (Alternativ schreiben Sie Dinge auf eine sehr lange Zeile mit Semikolons zwischen Befehlen. Hässlich, aber keine Klammer/Einrückung Probleme.) –
ok, ich bekomme es jetzt, und das würde das "no script following" dingy erklären. Der Interpreter erwartete eine Klammer in derselben Zeile wie die if-Anweisung. Ich habe auch bemerkt, dass das Schlüsselwort, wenn es durch ein Leerzeichen getrennt werden sollte und nicht auf das Auswertungssymbol geklebt werden konnte, wie wenn {} – fabjoa
Beachten Sie auch, dass '[Datei existiert ...]' gibt ein wahr/falsch Ergebnis, also Sie muss das Ergebnis nicht explizit mit 1 vergleichen: 'if {$ apsta} {...}' –