Version 5 of Einfach man Tcl

Updated 2002-11-14 19:26:50

Richard Suchenwirth 2002-11-14 - This is the man(ual) page that describes the complete Tcl syntax, translated to German and with added comments. See also Einfach Tcl.


Dies ist die von mir hand�bersetzte Kernsyntax (man Tcl(n)). Kursive Zus�tze sind von mir. Der juristisch-artige Stil stammt von der Manpage, hat jedoch den Vorteil, da� man jedes Wort auf die Goldwaage legen kann (im Zweifel gilt nat�rlich die englische Originalversion ;-)

Wer die drauf hat, und dazu die Einzelbestimmungen der wichtigsten built-in-Kommandos kennt (die anderen kann man sich jederzeit durch Manual-Lekt�re "nachladen"), kann Tcl. Naja, ein bi�chen praktische �bung ist sicher auch von Nutzen...


(1) Ein Tcl-Script ist ein (Unicode-)String, der ein oder mehrere Kommandos enth�lt. Semikolons und Zeilenvorsch�be sind Kommandotrenner, wenn nicht gequotet. Schlie�ende eckige Klammern beenden ein Kommando w�hrend der Substitution, au�er wenn gequotet.

Ein Script kann ein Sourcefile sein, das wieder andere Sourcefiles anzieht, also auch ein recht komplexer Softwarebrocken, aber auch z.B. in dem Kommando

        if {$i<0} {puts underflow!}

ist "puts underflow!" ein, nur viel k�rzeres, Script, das als Argument an das if-Kommando �bergeben wird. Unicode (Zeichendarstellung mit etwa 16 Bits) verh�lt sich zu ASCII etwa wie die rationalen zu den ganzen Zahlen: man kann danach zwar immer noch nicht alles, aber schon unendlich viel mehr ;-) Ein Vorteil von Tcl ist, da� die Unicode-Abhandlung ziemlich transparent erfolgt und �berall vorauszusetzen ist.

(2) Ein Kommando wird in zwei Schritten ausgewertet. Zuerst bricht es der Tcl-Interpreter in W�rter und nimmt Substitutionen vor, und zwar f�r alle Kommandos in der gleichen Weise. Das erste Wort wird als Name des Kommandos verwendet, und es wird dann mit den anderen W�rtern als Argumenten aufgerufen. Die Implementation des Kommandos ist frei, jedes seiner Argumente in jeglicher Weise zu interpretieren, z.B. als Integer, Variablenname, Liste, oder Tcl-Script. Verschiedene Kommandos interpretieren ihre W�rter (evtl.) verschieden.

Diese Zweiteilung auch der Syntax ist enorm wichtig. Von au�en gesehen, ist die komplette Sprache mit den paar Regeln in diesem Text beschrieben (und z.B. festgelegt, da� der Operator vor den Operanden steht, wie in LIST, bin/sh... Von innen gesehen kann jedes Kommando mit seinen Argumenten machen, was es will, und sie zum Beispiel als Infixnotation (expr) oder mit speziellen Sprachen (regexp) interpretieren und bearbeiten. Da regexp/regsub den runden, geschweiften, eckigen Klammern ganz andere Bedeutung zulegt, werden regul�re Ausdr�cke sinnvollerweise durch geschweifte Klammern au�en vor dem Blick des Tcl-Parsers gesch�tzt.

(3) Die W�rter eines Kommandos werden durch Whitespace (Blank oder Tab, nicht Zeilenvorschub - weil Kommandotrenner) getrennt.

Dies gilt auch f�r Folgen von geschweiften Klammern, z.B. "{1 2}{3 4}". Um einen Syntaxfehler zu vermeiden, mu� ein Blank dazwischen: "{1 2} {3 4}". Erst dadurch sind es zwei W�rter, die wiederum durch {} gruppiert sind.

(4) Wenn das erste Zeichen eines Worts ein Anf�hrungszeichen (") ist, wird das Wort beim n�chsten Anf�hrungszeichen beendet. Wenn Semikolons, schlie�ende eckige Klammern oder Whitespace-Zeichen (inklusive Zeilenvorschub) zwischen den Anf�hrungszeichen stehen, werden sie als normale Zeichen behandelt und sind Teil des Wortes. Kommando-, Variablen- und Backslash-Substitutionen werden auf den Zeichen des Wortes vorgenommen, wie unten beschrieben. Die Anf�hrungszeichen werden nicht Teil des Wortes.

Also einfach: Anf�hrungszeichen gruppieren, wie auch bei Unix und sogar DOS. Sie haben jedoch nicht die Funktion, den Datentyp string besonders anzuzeigen, da in Tcl konzeptuell (vom Parser her gesehen) alles ein String ist. Also sind whitespacelose W�rter wie "foo" und foo �quivalent.

(5) Wenn das erste Zeichen eines Wortes eine �ffnende geschweifte Klammer ({) ist, wird das Wort mit der dazu passenden schlie�enden geschweiften Klammer beendet. Geschweifte Klammern k�nnen innerhalb eines Wortes geschachtelt werden: f�r jede zus�tzliche �ffnende geschw.Klammer mu� eine zus�tzliche schlie�ende geschw.Klammer folgen (wenn aber geschweifte Klammern durch Backslash gequotet sind, z�hlen sie nicht bei der Klammerbalance). Auf den Zeichen innerhalb der geschweiften Klammern finden keine Substitutionen statt, au�er Backslash-Zeilenvorschub. Auch Semikolons, Zeilenvorsch�be, schlie�ende eckige Klammern oder Whitespace werden nicht besonders interpretiert. Das resultierende Wort besteht aus exakt den Zeichen zwischen den �u�eren geschw.Klammern. Die �u�eren geschw.Klammern geh�ren nicht zum Wort.

Merkhilfe: Geschweifte Klammern sagen "gruppier mich, aber r�hr meinen Inhalt nicht an!" (wie singlequotes '...' in Unix). Insbesondere kann ein Wort in geschweiften Klammern oder Anf�hrungszeichen auch wieder Kommandos enthalten (z.B. der body einer proc, die Anweisungsteile bei if/for/foreach/while...) Durch solche "Selbsteinbettung" k�nnen diese wenigen Regeln zum Bau beliebig m�chtiger Strukturen verwendet werden...

(4) Wenn ein Wort eine �ffnende eckige Klammer ([) enth�lt, wird Kommando-Substitution vorgenommen. Dazu wird der TclInterpreter rekursiv aufgerufen, um die Zeichen nach der �ffnenden eckigen Klammer als Tcl-Script auszuwerten. Das Script kann ein oder mehrere Kommandos enthalten und mu� mit einer schlie�enden eckigen Klammer (]) enden. Das Ergebnis des Scripts (das Ergebnis des letzten ausgef�hrten Kommandos des Scripts) wird an der Stelle der eckigen Klammern, und aller Zeichen zwischen ihnen, in das Wort hineinsubstituiert. In einem Wort k�nnen beliebig viele Kommando-Substitutionen vorkommen. Kommando-Substitution findet nicht statt, wenn das Wort in geschweiften Klammern steht.

Analogie zu Unix: Back-Apostrophe wie in set D=pwd, aber besser schachtelbar

(5) Wenn ein Wort ein Dollarzeichen ($) enth�lt, wird Variablen-Substitution vorgenommen. Das Dollarzeichen und die nachfolgenden Zeichen werden in dem Wort durch den Wert einer Variablen substituiert, und zwar in einer der folgenden Formen:

$name name ist der Name einer skalaren Variable; er endet beim ersten Zeichen, das nicht Buchstabe, Ziffer oder Unterstrich ist (hier also eine Restriktion der Sprache von Variablennamen - kann aber durch ${name} aufgehoben werden)

$name(index) name ist der Name einer Array-Variablen, index ist der Name eines Elements in dem Array. name darf nur aus Buchstaben, Ziffern und Unterstrichen bestehen. Kommando-, Variablen-, und Backslash-Substitutionen werden auf den Zeichen von index ausgef�hrt

${name} name ist der Name einer skalaren Variable und kann beliebige Zeichen mit Ausnahme von schlie�ender geschweifter Klammer enthalten.

In einem Wort kann eine beliebige Anzahl von Variablensubstitutionen stattfinden. Variablensubstitution findet nicht in W�rtern innerhalb von geschweiften Klammern statt.

Tcl-Arrays sind ein Thema f�r sich. Hier nur kurz: es sind Hashtabellen, die einen key-String auf einen value-String abbilden, und k�nnen damit u.a. C-Arrays, beliebigdimensionale Matrizen usw. implementieren.

(6) Wenn ein Backslash (\) in einem Wort auftritt, wird Backslash-Substitution vorgenommen. In allen au�er den folgenden F�llen wird der Backslash entfernt und das folgende Zeichen als normales Zeichen im Wort belassen. So k�nnen Anf�hrungszeichen, eckige Klammern und Dollarzeichen in W�rtern stehen, ohne besondere Substitution auszul�sen. Besondere Backslash-Substitutionen sind:

\a Signalton ("bell", 0x7)

\b Backspace 0x8

\f Seitenvorschub, form feed 0xC

\n Zeilenvorschub, newline 0xA

\r Wagenr�cklauf, carriage return 0xD

\t Tabulator, 0x9

\v Vertikaltabulator, 0xB

\(newline)whitespace: Der Backslash, Zeilenvorschub, und alle Blanks und Tabs nach dem Zeilenvorschub zusammen werden durch ein einzelnes Blank ersetzt. Diese Substitution erfolgt in einem eigenen Prepass vor dem Parsen und findet auch zwischen geschweiften Klammern statt. Das bei der Substitution entstehende Blank wird als Worttrenner behandelt, wenn es nicht innerhalb von geschweiften Klammern oder Anf�hrungszeichen steht.

\\ Backslash (\)

\ooo Die 1..3 Oktalziffern ooo geben einen 8-Bit-Wert f�r das Unicode-Zeichen, durch das sie ersetzt werden.

\xhh Die Hexziffern hh geben einen 8-bit-Wert f�r das Unicode-Zeichen, durch das sie ersetzt werden. Es k�nnen beliebig viele Hexziffern folgen, jedoch werden nur die letzten beiden verwendet.

\uhhhh Die 1..4 Hexziffern hhhh ergeben einen 16-bit-Wert f�r das Unicode-Zeichen, durch das sie ersetzt werden.

Backslash-Substitution findet nicht auf W�rtern in geschweiften Klammern statt (au�er Backslash-Newline, s.o.)

(7) Wenn ein Hash-Zeichen (#) an einer Stelle steht, an der Tcl das erste Zeichen des ersten Worts eines Kommandos erwartet, dann werden das Hashzeichen und die nachfolgenden Zeichen bis zum n�chsten Zeilenvorschub als Kommentar behandelt und ignoriert. Das Zeichen # hat diese Bedeutung nur als erstes Zeichen eines Kommandos.

Allgemein mu� man bei Kommentaren vorsichtig sein, da die Intuition hier oft mehr riskiert, als nach dieser Regel gilt. Auskommentieren von Codeteilen wirkt nur, wenn dessen geschweifte Klammern auch balanciert sind; sicherer und stressfreier ist es, statt dessen if 0 {...} herumzuschachteln.

(8) Jedes Zeichen wird vom Tcl-Parser bei der Gruppierung von Worten genau einmal bearbeitet. Wenn zum Beispiel Variablensubstitution stattfindet, dann werden auf dem eingesetzten Wert der Variablen keine weiteren Substitutionen durchgef�hrt. Wenn Kommandosubstitution stattfindet, dann wird das in eingeschlossene Kommando direkt von dem rekursiven Aufruf des Tcl-Interpreters verarbeitet; vor dem rekursiven Aufruf werden keine Substitutionen durchgef�hrt, und auf dem Ergebnis des eingebetteten Scripts finden keine weiteren Substitutionen statt.

Substitutionen finden in der Reihenfolge von links nach rechts statt, und jede Substitution wird vollst�ndig ausgef�hrt, bevor die n�chste versucht wird. Daher wird eine Kommandofolge wie

        set y [set x 0][incr x][incr x]

immer die Variable y auf den Wert 012 setzen.

Wenn mehrfache Evaluation erw�nscht wird, kann man explizit eval aufrufen - oder eingebettete Kommandos: [set x] reagiert wie "$x", kann aber mehrfach geschachtelt werden.

(9) Substitutionen beeinflussen nicht die Wortgrenzen eines Kommandos. Zum Beispiel wird bei Variablensubstitution der gesamte String-Wert der Variablen als Teil des einzelnen Worts eingesetzt, auch wenn er Leerzeichen enth�lt.


Arts and crafts of Tcl programming