Table Editor And Planner, Or: Teapot!


teapot ist ein Tabellenkalkulationsprogramm für UNIX, das neben der Portabilität und Erweiterbarkeit, auch auf die Verwendung moderner Konzepte Wert legt. Dazu gehören z.B. dreidimensionale Tabellen und iterative Ausdrücke.

Das wichtigste Grundprinzip von teapot ist die funktionale Adressierung von Zellen, d.h. die Aufgabe der vermutlich von VisiCalc stammenden Adressierung der Form A0, C5, usw.

Die wesentlichen Merkmale, die teapot von anderen Tabellenkalkulationen unterscheiden, sind:

Um die obigen Punkte etwas zu illustrieren, folgen nun einige Beispiele. Eine der wichtigsten Funktionen in teapot ist @(x,y,z). Wenn sie mit ganzen Zahlen aufgerufen wird, dann ist das Ergebnis der Wert der Zelle mit den angegebenen Koordinaten. Jedes dieser Argumente kann ausgelassen werden, als Koordinate wird dann die Position des aktuellen Ausdrucks benutzt. Wegen des funktionalen Ansatzes kann eine solche Zahl eine Konstante oder der Wert eines Ausdrucks sein, der zu einer ganzen Zahl ausgewertet wird. Indizierte Zugriffe sind also ohne weiteres möglich.

Alternativ kann @() auch mit einem Zeiger auf eine Zelle aufgerufen werden. Zeiger sind ein eigener Datentyp, Elemente dieses Typs verweisen auf die Position einer Zelle und werden durch Labels oder Funktionen definiert. Durch die Verwendung von Labels werden Ausdrücke lesbarer. Statt A0+A1 (historisch) oder @(0,0)+@(0,1) kann man nun @(Fix_Kosten)+@(Variable_Kosten) oder, falls Labels für Spalten und Zeilen benutzt werden, @(x(Kosten),y(Papier))+@(x(Kosten),y(Bänder)) schreiben. (Dabei sind x(p) und y(p) die Spalten- und Zeilenkoordinate des Zeigers.)

Ein weiteres wichtiges Element ist eval(). Diese Funktion liefert den Wert des Ausdrucks auf den das Argument zeigt, aber die Auswertung wird im Kontext des aktuellen Ausdrucks vorgenommen. Anstatt viele Zellen mit dem gleichen Ausdruck zu benutzen, kann einer Zelle ein Label gegeben werden und die anderen Zellen bekommen nur eine Referenz auf diese Zelle. Wenn der Ausdruck dann geändert werden muß, so ist dies nur ein Mal nötig.

teapot hat keine eingebaute Programmiersprache, weil Programme in solchen Sprachen meist schlecht wartbar sind. Das bedeutet aber nicht, daß z.B. auf bedingte Auswertung verzichtet werden muß. Bedingte Auswertung wird durch eval mit einem Zeiger möglich, wobei eine Koordinate einen oder mehrere relationale Ausdrücke enthält, die jeweils zu 0 oder 1 ausgewertet werden.

Die erwähnten getakteten (iterativen) Ausdrücke bestehen aus zwei Teilen, dem reset und clock Anteil. Bei der ersten Auswertung einer Zelle wird der reset Anteil ausgewertet, alle weiteren Male wird der clock Anteil benutzt. Der reset Ausdruck 1 und der clock Ausdruck @()+1 ergibt eine Zelle, die beim Takten des Arbeitsblattes hochzählt. Es ist recht einfach, mittels getakteter Auswertung game of life oder die iterative Berechnung von Wurzeln als Arbeitsblatt zu modellieren.

teapot ist in ANSI C geschrieben und sollte auf jedem halbwegs POSIX konformen System mit den folgenden zwei Einschränkungen compilieren: SYSV curses wird für die Benutzerschnittstelle benutzt, also gibt es eine schnelle Bildschirmaktualisierung und Unterstützung von Funktionstasten. Die freie, zu SYSV curses kompatible, ncurses Bibliothek funktioniert aber auch ohne Probleme. Außerdem wird die Sun XDR Bibliothek benutzt, deren Code ebenfalls frei verfügbar ist. Im Moment läuft teapot auf Solaris 1.1.2, Solaris 2.3, HP-UX 9, Linux, FreeBSD 2.x und Ultrix 4.3. Eine Portierung auf andere Systeme ist normalerweise durch Anpassung des Makefiles möglich.

Source und Dokumentation zu teapot sind als GNU zipped tar file über ftp verfügbar.


Michael Haardt (michael@cantor.informatik.rwth-aachen.de)