Silmor . de
Site Links:
Impressum / Publisher

Scripting mit Tcl

Überblick

Syntax

Die Basis von Tcl bildet das "Kommando". Jede Zeile wird als ein Kommando interpretiert. Das Kommando selbst und seine Argumente sind durch Leerzeichen von voneinander getrennt. Man kann mehrere Kommandos auf der selben Zeile durch ein Semikolong trennen - das wird allerdings nur sehr selten von Tcl Programmierern genutzt:

kommando parameter1 parameter2...
kommando1 ... ; kommando2 ...

Leere Zeilen und Zeilen, die mit # beginnen werden vom Tcl-Interpreter ignoriert. Wenn man einen Kommentar hinter ein Kommando setzen will muss man ihn allerdings mit Semikolon abtrennen:

#ein Kommentar
kommando ;# auch ein Kommentar
kommando #kein Kommentar

Variablen können praktisch beliebige Namen erhalten - man sollte sich allerdings auf normale Buchstaben und Ziffern beschränken, da es sonst mit dem Abrufen der Variablen schwierig werden könnte. Variablen werden mit dem Kommando set gesetzt und können mit ihm auch abgerufen werden

#setzen der Variable:
set variable wert
#abrufen des Wertes:
set variable
#Fehler:
set variableExistiertNicht

Einen Spezialfall stellen Arrays dar. Bei diesem Variablentyp wird einfach ein String-Index in Klammern hinter den Variablennamen gesetzt:

set meinarray(index1) wert

Wenn man mehrdimensionale Arrays benutzen will muss man dies simulieren, indem man den Index entsprechend konstruiert (z.B. mit Leerzeichen oder Unterstrichen trennen).

Die restliche Tcl-Syntax beschäftigt sich mit Ersetzungen. Die einfachste Ersetzung ist die Variablenersetzung. Wird an Stelle eines Kommandoarguments ein Variablenname mit vorangestelltem $-Zeichen geschrieben, dann wird dieses Argument durch den Inhalt der Variablen ersetzt bevor das Kommando ausgeführt wird:

set variable hallo
kommando $variable
#entspricht:
kommando hallo

Wenn Variablennamen Leerzeichen oder andere Sonderzeichen enthalten kann man auch zusätzliche Klammern um den Namen setzen:

kommando ${variable mit leerzeichen}

Eine weitere Ersetzungsform ist die Stringverkettung. Hier werden mehrere Argumente zu einem einzigen zusammengefasst. Es gibt zwei Typen von Stringverkettung. Zunächst kann man Strings dadurch verketten, dass man Anführungszeichen um sie herum setzt:

kommando "ein string mit $variable"

In diesem Fall werden innerhalb des Strings allerdings noch weitere Ersetzungen stattfinden (im Beispiel oben wird nach der Variablen variable gesucht und ihr Inhalt anstatt $variable eingesetzt. Wenn man diese Ersetzung verhindern will muss man dem $-Zeichen einen Backslash (\) voranstellen (weitere \-Sequenzen gelten analog C, wie \\ für \ selbst und \n für Zeilenumbruch). Soll ein String über mehrere Zeilen verkettet werden muss am Ende der Zeilen (ausser der letzten) ein Backslash stehen.

Andererseitz kann man den String auch in { und } einschliessen. Tcl zählt dabei die Anzahl der {-Klammern mit und verlangt eine entsprechende Anzahl von }-Klammern.

kommando {mit $-Zeichen {und {geschachtelten} klammern}}

Diese Art der Strings darf über mehrere Zeilen gehen.

Die letzte Form der Ersetzung ist die Kommandoersetzung. Dabei wird das Ergebnis des Kommandos in [ und ] an dessen Stelle dem äußeren Kommando übergeben:

kommando [[kommando2 ...] ...

Zu beachten ist noch, dass Backslashes am Ende der Zeile immer zur Verkettung mit der nächsten Zeile führen, auch wenn diese Zeile einen Kommentar enthielt. Auch die Verkettung durch { und } wird durchgeführt bevor Kommentare aussortiert werden.

In neueren Tcl-Versionen (ab 8.x) ist noch das Konzept der Namespaces hinzugekommen. Namespaces können Variablennamen und Kommandonamen vorangestellt werden (getrennt durch ::). Man kann beides relativ zum aktuellen Namespace oder absolut (beginnt mit ::) addressieren. Tcl beschwert sich, wenn man versucht etwas in einem Namespace zu tun, der nicht vorher mit dem Kommando namespace angelegt wurde. Ansonsten verhalten sich Namespaces vollkommen transparent gegenüber den oben erwähnten Features.

Das war die gesamte Syntax von Tcl. Es gibt keine eingebauten Schlüsselworte, keine kryptische Zugriffssyntax auf die zuletzt genutzte Variable, etc.pp. Wie Tcl als Schlüsselwortfreie Sprache funktioniert erklären die Standardkommandos unten.

Wichtige Kommandos

Tcl kennt keine in der Syntax verankerten Schleifen und Verzweigungen, dafür eine Reihe von Kommandos, die diese Standardfunktionen intern abbilden. Da es sich aber um normale Kommandos handelt verhindert nichts im Tcl-Interpreter, dass man diese Kommandos umbenennt, neu definiert oder löscht - man kann ganze Nachmittage damit Spass haben einen obskuren Bug zu jagen, der dadurch entsteht, dass irgendwo das Kommando if umdefiniert wurde. Hier also die notwendige Warnung: auch wenn diese Möglichkeiten bestehen sollte man sie nicht nutzen - die Ergebnisse können sehr überraschend sein.

Wenn in der Liste unten ein ?Argument? mit zwei "??" auftaucht handelt es sich um ein optionales Argument.

puts ?fd? "string ..."
Gibt den String auf Standard-Out aus. Oder in die entsprechende Datei, wenn bei ?fd? ein Dateidescriptor angegeben wird.

open dateiname mode ; close fd
Open öffnet eine Datei und gibt den Dateideskriptor als Ergebnis zurück. Mode sollte r (nur lesen), w (nur schreiben), w+ (lesen und schreiben) oder a (anhängen) sein. Close schließt die Datei. Das Beispiel schreibt "Hallo Welt!" in eine Datei:

set fd [open datei w]
puts $fd "Hallo Welt!"
close $fd

proc name {args...} {body}
Erzeugt eine neue Prozedur, die von beliebiger Stelle im Programm aufgerufen werden kann:

proc greet {} {
	return Hallo
}
proc hallo {str} {
	puts "[greet] $str!"
}
hallo Welt

Das Kommando return beendet die Prozedur und setzt gleichzeitig den Rückgabewert der Prozedur. Wenn kein return Kommando auftaucht wird einfach ein leerer String zurückgegeben.

expr formel...
führt eine mathematische Berechnung aus und liefert das Ergebnis zurück:

puts [expr 1 + 2 * 3]

for init check post body
ist eine simple for-Schleife, ähnlich der in C. Das erste Argument wird vor dem ersten Schleifendurchlauf als Kommando ausgeführt, das Dritte nach jedem Durchlauf, das Zweite ist ein boolscher Ausdruck, der Wahr zurückgibt solange die Schleife weiterlaufen soll, das vierte Argument ist der Schleifenkörper, der für jeden Schleifendurchlauf interpretiert wird. Beispiel:

for {set i 0} {$i < 5} {incr i} {
	puts "Durchlauf $i"
}

dieses Beispiel wird die Zeilen "Durchlauf 0" bis "Durchlauf 4" ausgeben (das Kommando incr zählt die übergebene Variable um 1 hoch).

if bedingung wennwahr ?wennfalsch?
Das Kommando if wertet sein erstes Argument als boolschen Ausdruck aus und führt das zweite Argument aus, falls das Ergebnis wahr ist und das optionale dritte Argument falls das Ergebnis falsch ist.

Es existieren natürlich noch wesentlich mehr Kommandos, der Leser sei hier allerdings auf die recht umfangreiche Dokumentation von Tcl verwiesen.

Tk

Tk ist das Grafiktoolkit von Tcl. Es war eines der ersten einfach zu bedienenden und plattform-unabhängigen Grafiktoolkits und wurde daher von einigen anderen Scriptsprachen und C-Programmen als Interface importiert (z.B. Perl/Tk, Pythons TkInter, etc.pp.).

Tk besitzt alle wichtigen einfachen Widgets (button, checkbox, label, etc.), zwei komplexe Widgets (text, canvas) und drei Layout-Manager. Das reicht aus, um die meisten GUI-Anwendungen zu bauen, entspricht durch seinen Motif-Look aber nicht den modernsten Ansprüchen.

Widgets sind in einer Hierarchie angeordnet, die mit dem Hauptfenster beginnt: .

Subwidgets sind durch Punkt (.) voneinander getrennt. Jedes Widget bekommt beim Anlegen sein eigenes Kommando, mit dem es danach manipuliert werden kann.

Hier ein einfaches Beispiel:

#!/usr/bin/wish

#button: gibt "Hallo Welt" auf stdout aus, wenn gedrückt
button .hallo -text "Hallo" -command {puts "Hallo Welt!"}

#button: beendet Programm, indem es alle Widgets löscht
button .exit -text Exit -command {destroy .}

#beide Buttons mit Pack-Layout darstellen:
pack .hallo .exit

#ende: warten bis Hauptfenster gelöscht

Andere Erweiterungen


Webmaster: webmaster AT silmor DOT de