Programmeinheiten

H
Google

Prozedur

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:

  1. Beim Aufruf von doppelt wird nicht der Inhalt, sondern der Name einer Variablen übergeben (also kein $-Zeichen!).
  2. 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.
  3. 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.

Modul

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:
  1. Die Prozeduren sind dem Interpreter bekannt.
  2. 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:

  1. Wenn man während der Entwicklung an einem Modul etwas geändert hat, muss man ihn neu "sourcen", damit die Änderungen wirksam werden.
  2. Mit

    info procs

    kann man die Namen der Prozeduren abfragen, die dem Interpreter im Augenblick bekannt sind.
  3. 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.

Package

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:
Data Becker Deutschland
eBay Partnerprogramm
Suchen nach:
In Partnerschaft mit Amazon.de
T-Mobile eShop

 


Valid XHTML 1.0!

Design by Gottfried Lindner

zuletzt geändert am 30.04.2005.

Besucherzähler