Eine Prozedur sieht etwa so aus:
download ist der Name der Prozedur. Daneben steht die Parameterleiste.
Es wird nicht zwischen Funktion und Unterprogramm unterschieden.
Mit dem return-Befehl kann eine Prozedur einen Wert zurückliefern. Dieser kann
abgefragt werden mit
ret ist dabei ein Variablenname. Das Klammernpaar liefert den Rückgabewert.
Enthält eine Prozedur keinen return-Befehl, wird implizit ein Leerstring
zurückgegeben.
Eine Prozedur kann jedoch auch so aufgerufen werden
wenn der Rückgabewert nicht von Interesse ist. Die beim Aufruf übergebenen
aktuellen Parameter müssen konsistent zu den formalen Parametern der
Prozedurdefinition sein.
Für einen formalen Parameter kann in der Prozedurdefinition ein Standardwert
angegeben werden. Dies wurde im obigen Beispiel für qu getan. Dann kann
man beim Prozeduraufruf diesen Parameter weglassen, wenn der Standardwert gelten
soll, z.B.
Das Weglassen ist jedoch nur am Ende der Parameterliste möglich. Wenn man
allerdings versehentlich nur zwei Parameter angibt, wird dies nicht mehr
als Formalfehler erkannt.
Man kann als letzten formalen Parameter auch den festen Namen args angeben.
Dann können als entsprechendem aktuellen Parameter beliebig viele Werte
angegeben werden. Diese stehen dem aufgerufenen Programm als Liste zur
Verfügung. Beispiel:
|
Wie erwähnt wird beim Aufruf eine Umformung gemacht zwischen "beliebig vielen Parametern" und
einer "Liste von Parametern" (= ein Parameter). Wollte man in psatz eine weitere Prozedur aufrufen, die
ebenfalls einen args-Parameter hat, so kann man diesen nicht einfach durchreichen.
|
Parameter werden normalerweise mit call-by-value übergeben, d.h. es ist keine
Änderung der aktuellen Parameter des Aufrufers möglich. call-by-reference ist
auch vorgesehen, jedoch ist die Syntax dazu etwas gewöhnungsbedürftig. Beispiel:
- Beim Aufruf von doppelt wird nicht der Inhalt, sondern der Name
einer Variablen übergeben (also kein $-Zeichen!).
- Mit dem upvar-Befehl wird der formale Parameter aPar,
der einer Variablen des Aufrufers entspricht, lokal mit dem Symbol
a verknüpft. Dass hier der gleiche Name verwandt wie für die Variable
im Hauptprogramm, ist ohne Bedeutung.
- Die lokale Variable a kann in weiteren Befehlen der Prozedur
benutzt werden und ist identisch mit der verknüpften Variablen.
Der puts-Befehl zeigt somit 20 als Inhalt von a an.
Ein Modul ist eine Sourcedatei - üblicherweise mit der Endung tcl, z.B. Modul.tcl.
Er enthält eine Reihe von Prozedurdefinitionen und Befehle außerhalb von Prozeduren.
Jeder der genannten zwei Teile darf auch fehlen.
Mit dem Befehl
source Modul.tcl
wird der Inhalt des Moduls geladen.
Im Einzelnen bedeuted dies:
- Die Prozeduren sind dem Interpreter bekannt.
- Die Befehle außerhalb von Prozeduren (üblicherweise
irgendwelche Initialisierungen) werden ausgeführt.
Der source-Befehl wird oft während der Entwicklung manuell in der Tcl-Shell
aufgerufen.
Alle Variablen, die außerhalb von Prozeduren verwandt werden, sind global.
Diese können auch interaktiv in der Tcl-Shell angesprochen werden.
Mit dem Befehl
info globals
kann man die Namen aller globalen Variablen abfragen.
Es gibt einige globale Variable, die vom System automatisch angelegt und
versorgt werden.
Zurück zum source-Befehl: Folgendes ist zu beachten:
- Wenn man während der Entwicklung an einem Modul etwas geändert
hat, muss man ihn neu "sourcen", damit die Änderungen wirksam werden.
- Mit
info procs
kann man die Namen der Prozeduren abfragen, die dem Interpreter im Augenblick
bekannt sind.
- Besteht eine Änderung im Löschen einer Prozedur procA, so
ist diese trotzdem weiterhin vorhanden. Um sie zu löschen, könnte man den
Befehl
rename procA ""
verwenden oder die Tcl-Shell neu starten.
Mit rename können Sie allgemein Prozeduren dynamisch umbenennen - interaktiv oder
als Programmbefehl.
Damit der Sourcecode durchschaubar bleibt, sollte man dies jedoch nicht ohne
triftigen Grund tun.
Packages dienen dazu, mehrere Sourcemodule zu einer logischen Einheit
zusammenzufassen. (Ein ähnliches Konzept ist z.B. in Java vorhanden.)
Fertige Zusatzpakete werden meist als Packages angeboten.
Um eine Sourcedatei einem Package zuzuordnen, wird an den Anfang
der Datei der Befehl
package provide packName
geschrieben. Es gibt zusätzlich die Möglichkeit, Versionen zu führen.
Darauf wird hier nicht eingegangen. Das Package packName
besteht schließlich aus der Menge aller Sourcedateien, die einen
solchen Befehl enthalten.
Bevor ein fremdes Sourcemodul Prozeduren aus einem Package aufrufen
kann, muss es dieses referenzieren mit dem Befehl
package require packName
Dadurch wird das Package geladen.
Es sind noch Vorkehrungen zu treffen, damit alle benötigten
Sourcedateien gefunden werden. Es gibt die vordefinierte globale
Variable auto_path, die mit einer Liste von Suchpfaden
versorgt werden muss. In diesen Pfaden wird nach Dateien
pkgIndex.tcl geschaut und diese ggf. "gesourced".
Beispiel für eine pkgIndex.tcl-Datei:
Wie man erkennt, enthält die Datei Informationen zu vorhandenen Packages
und welche Souredateien dazugehören. Die Dateien enthalten Tcl-Code und
können somit manuell gepflegt werden. Einfacher kann man sie mit dem Befehl
pkg_mkIndex
erstellen.
In der einfachsten Form, wenn alle Tcl-Dateien und auch die zu erzeugende
Datei pkgIndex.tcl im Arbeitsverzeichnis liegen, lautet der Befehl:
pkg_mkIndex .
Beispiel: Referenzieren eines Package:
if {[lsearch $auto_path Pfad] == -1} {
lappend auto_path Pfad
}
if {![info exist Prozedur]} {
package require UBL 1.0
}
Durch die Abfragen soll verhindert werden, dass die Befehle mehrfach ausgeführt
werden. Prozedur ist der Name einer charakteristische Prozedur, die in dem
fraglichen Package enthalten ist.
Weitere Informationen zum package-Befehl.
|
Bitte beachten Sie auch das Angebot unserer Werbepartner:
|
|
|
|
|
|
|