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:
@(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.