Handbuch
Die folgende Dokumentation ist Bestandteil der BeeBase-Distribution und gibt es auch als PDF.
[ << ] | [ >> ] | [Anfang] | [Inhalt] | [Index] | [ ? ] |
16. BeeBase programmieren
Dieses Kapitel (das größte dieser Dokumentation) beschreibt die Programmiersprache von BeeBase, einschließlich aller verfügbaren Funktionen. Das Kapitel dient jedoch nicht als allgemeine Anleitung für Programmieren. Man sollte mit den Grundzügen der Programmierung vertraut sein und schon kleinere (richtig funktionierende :-)) Programme geschrieben haben.
16.1 Programmeditor | Wo ein BeeBase-Programm eingegeben wird. | |
16.2 Externe Programmquellen | Benutzung Ihres Lieblingseditors zum Programmieren. | |
16.3 Vorverarbeitung | Include-Dateien, bedingte Kompilation und Konstanten. | |
16.4 Programmiersprache | Der Aufbau der Ausdrücke. | |
Funktionen | ||
16.5 Befehle definieren | Funktionen- und Variablendefinitionen. | |
16.6 Programmsteuerungsfunktionen | Schleifen, bedingte Ausdrücke und mehr. | |
16.7 Typaussagen | Feststellen des Typs eines Ausdrucks. | |
16.8 Typumwandlungsfunktionen | Typen umwandeln. | |
16.9 Boolesche Funktionen | AND, OR, und NOT. | |
16.10 Vergleichsfunktionen | Werte von Ausdrücken vergleichen. | |
16.11 Mathematik-Funktionen | Addieren, Multiplizieren, etc. | |
16.12 Zeichenkettenfunktionen | Nützliches Zeug für Zeichenketten. | |
16.13 Funktionen für mehrzeilige Texte | Nützliches Zeug für mehrzeilige Texte. | |
16.14 Datum- und Zeitfunktionen | Nützliches Zeug für Datum und Zeit. | |
16.15 Listenfunktionen | Listenverarbeitungsbefehle. | |
16.16 Benutzereingabefunktionen | Den Benutzer nach Eingaben fragen. | |
16.17 E/A-Funktionen | Dateiein- und -ausgabebefehle. | |
16.18 Datensatzfunktionen | Nützliches Zeug für Datensätze. | |
16.19 Feldfunktionen | Verändern von Feldern. | |
16.20 Tabellenfunktionen | Verändern von Tabellen. | |
16.21 Oberflächenfunktionen | Verändern der Benutzeroberfläche. | |
16.22 Projektfunktionen | Informationen über das aktuelle Projekt erhalten. | |
16.23 Systemfunktionen | Betriebssystembezogene Funktionen. | |
16.24 Variablen | Vordefinierte Variablen. | |
16.25 Konstanten | Vordefinierte Werte von Konstanten. | |
Nützliche Informationen | ||
16.26 Funktionale Parameter | Funktionen als Argumente in Funktionsaufrufen verwenden. | |
16.27 Typdeklarierer | Typen für Variablen. | |
16.28 Aufbau von Ausdrücken | Die Bedeutung eines Ausdrucks. | |
16.29 Auslösefunktionen | Wie Auslösefunktionen benutzt werden. | |
16.30 Liste veralteter Funktionen | Funktionen, die entfernt wurden und Ersatz benötigen. | |
Funktionsverzeichnis | Übersicht aller Funktionen. |
16.1 Programmeditor
Um ein Programm für ein Projekt einzugeben, öffnet man den Programmeditor über den Menüpunkt `Programm - Ändern'. Sofern Sie die Einstellung Programmquellen intern (siehe Programmquellen) verwenden, öffnet dies das Fenster `Ändere Programm' mit:
- einem Texteditorfeld, in dem das Programm editiert wird
- einem Knopf `Kompilieren & Schließen', mit dem das Programm kompiliert und nach einer erfolgreichen Kompilation der Programmeditor verlassen wird.
- einem Knopf `Kompilieren', um das Programm zu kompilieren. Enthält das Programm irgendwo einen Fehler, dann wird eine Fehlerbeschreibung in den Fenstertitel und der Cursor an die fehlerhafte Stelle gesetzt.
- einem Knopf `Rückgängig machen', der alle Änderungen seit der letzten erfolgreichen Kompilation verwirft.
Der Programmeditor ist ein nicht-modales Fenster. Das Fenster kann offen gelassen und weiterhin mit dem Rest der Anwendung gearbeitet werden. Man kann den Editor zu jeder Zeit schließen, indem dessen Fensterschließ-Knopf gedrückt wird. Wurden Änderungen seit der letzten erfolgreichen Kompiliation vorgenommen, dann erscheint eine Sicherheitsabfrage, die um Bestätigung fragt, ob das Fenster geschlossen werden darf.
Falls Sie Menüpunkt `Programm - Quellen' auf `Extern' gesetzt haben, so wird bei Wahl von `Programm - Ändern' der externe Editor (siehe Externer Editor) mit dem Dateinamen der externen Quelldatei gestartet. Dies ermöglicht das Editieren der Programmquellen mit Ihrem Lieblingseditor (siehe Externe Programmquellen).
Man kann das Projektprogramm auch ohne das Öffnen des Programmeditors kompilieren, indem der Menüpunkt `Programm - Kompilieren' ausgewählt wird. Dies ist nützlich, wenn Änderungen an einer Include-Datei gemacht wurden und diese Änderungen in das Projektprogramm einfließen sollen.
16.2 Externe Programmquellen
Durch Wählen des Menüpunktes `Programm - Quellen - Extern' und Eingabe eines Dateinamens können die Programmquellen eines Projekts extern verfügbar gemacht werden. Dies erlaubt es, die Quelldatei für die Programmierung in Ihren Lieblingseditor zu laden.
Bei erfolgreicher Übersetzung wird das übersetzte Programm als neues Projektprogramm übernommen und beim Aufruf von Auslösefunkionen verwendet. Wenn Sie ein Projekt speichern, so wird das letzte erfolgreich übersetzte Program in der Projektdatei gespeichert. Von daher wird nach dem Speichern und Schließen eines Projekts die externe Programquelldatei nicht mehr benötigt. Sie können in Menüpunkt `Einstellungen - Externe Programmquellen aufräumen' einstellen, ob unbenötigte externe Quelledateien automatisch gelöscht werden sollen.
Der Zustand von Menüpunkt `Programm - Quellen' wird mit einem Projekt gespeichert. Wenn Sie ein Projekt, welches die externe Quelldateien-Einstellung verwendet, erneut öffnen, so wird die externe Quelldatei nach dem Öffnen erzeugt. Falls die externe Datei bereits existiert und verschieden von der im Projekt gespeicherten Version ist, so erscheint eine Sicherheitsabfrage bevor die Datei überschrieben wird.
Auf dem Amiga kann aus dem Editor heraus der compile
-Befehl an
BeeBase' ARexx-Port geschickt werden.
BeeBase lädt daraufhin die externe Quelldatei,
übersetzt sie, und liefert den Übersetzungsstatus mit einer optionalen
Fehlermeldung zurück. Die Fehlermeldung enthält Dateiname, Zeile und Spalte,
und eine Fehlerbeschreibung. Dies erlaubt es, auf die genau Fehlerstelle im
Editor zu springen.
Siehe ARexx compile, für weitere Details über Rückgabewerte und Fehlerformat.
16.3 Vorverarbeitung
BeeBase-Programme werden vorverarbeitet, wie ein C-Compiler einen C-Quellcode vorverarbeitet. Dieser Abschnitt beschreibt, wie die Vorverarbeitungs-Anweisungen verwendet werden.
Alle Anweisungen beginnen mit dem Rauten-Symbol #, welcher das erste Zeichen in einer Zeile sein muss. Leerzeichen und Tabulatoren können nach dem begonnenen # folgen.
16.3.1 #define | Konstanten definieren. | |
16.3.2 #undef | Konstanten un-definieren. | |
16.3.3 #include | Externe Dateien einfügen. | |
16.3.4 #if | Bedingte Kompilation. | |
16.3.5 #ifdef | Bedingte Kompilation. | |
16.3.6 #ifndef | Bedingte Kompilation. | |
16.3.7 #elif | Bedingte Kompilation. | |
16.3.8 #else | Bedingte Kompilation. | |
16.3.9 #endif | Bedingte Kompilation |
16.3.1 #define
|
Definiert ein neues Symbol mit dem gegebenen Namen und Inhalt. Das Symbol string kann jeder Text einschließlich Leerzeichen sein und endet am Zeilenende. Passt string nicht in eine Zeile, dann können weitere Zeilen durch ein Backslash-Zeichen \ am Ende jeder Zeile (außer der letzten) verwendet werden. Taucht das Symbol name im verbleibenden Quellcode auf, dann wird es durch den Inhalt von string ersetzt.
Beispiel: `(PRINTF "X ist %i" X)' gibt `X ist 1' aus (name's in Zeichenketten werden nicht verändert.)
Das Ersetzen von definierten Symbolen geschieht syntaktisch, das bedeutet, dass Symbole durch jeden Text ersetzt werden können, z.B. man kann sich seine eigene Syntax wie im folgenden Beispiel definieren:
#define BEGIN ( #define END ) BEGIN defun test () ... END |
Die zu ersetzende Zeichenkette einer Definition kann ein anderes Symbol
enthalten, das mit der #define
-Anweisung definiert wurde, um
verschachtelte Definitionen zu ermöglichen.
Es gibt jedoch eine Obergrenze von 16 verschachtelten Definitionen.
Siehe auch #undef, #ifdef, #ifndef.
16.3.2 #undef
|
Entfernt die Definition des Symbols name. Wurde name nicht definiert, dann passiert nichts.
Siehe auch #define, #ifdef, #ifndef.
16.3.3 #include
|
Liest den Inhalt von filename (eine Zeichenkette in Anführungszeichen) an diese Stelle. BeeBase sucht im aktuellen Verzeichnis und im in den Einstellungen festgelegten Verzeichnis (siehe Programm-Include-Verzeichnis) nach der zu ladenden Datei.
Der Dateiinhalt wird durch den Compiler verarbeitet, als ob er Teil des momentanen Quellcodes wäre.
Eine externe Datei kann eine oder mehrere externe Dateien enthalten. Es gibt
jedoch eine Obergrenze von 16 verschachtelten #include
-Anweisungen. Um
zu vermeiden, dass Dateien mehr als einmal eingefügt werden, kann die bedingte
Kompilation verwendet werden.
Man sollte vorsichtig sein, wenn man Quellcode in externe Dateien auslagert! Die Fehlersuche und das Auffinden von Fehlern in externen Dateien wesentlich schwerer. Man verschiebe daher nur getesteten und Projekt-unabhängigen Code in externe Dateien.
16.3.4 #if
|
Ist der gegebene konstante Ausdruck const-expr nicht NIL, dann wird der
Text bis zum zugehörigen #else
, #elif
oder #endif
zur
Kompilation verwendet, anderenfalls (der Ausdruck lieferte NIL) wird der
Text bis zum zugehörigen #else
, #elif
oder #endif
nicht
zur Kompilation herangezogen.
Momentan können nur TRUE und NIL als konstante Ausdrücke verwendet werden.
Siehe auch #ifdef, #ifndef, #elif, #else, #endif.
16.3.5 #ifdef
|
Ist das gegebene Symbol name mit einer #define
-Anweisung
definiert worden, dann wird der Text bis zum zugehörigen #else
,
#elif
oder #endif
zur Kompilation verwendet, anderenfalls
nicht betrachtet.
Siehe auch #if, #ifndef, #elif, #else, #endif.
16.3.6 #ifndef
|
Ist das gegebene Symbol name nicht mit einer #define
-Anweisung
definiert worden, dann wird der Text bis zum zugehörigen #else
,
#elif
oder #endif
zur Kompilation verwendet, anderenfalls
nicht betrachtet.
Siehe auch #if, #ifdef, #elif, #else, #endif.
16.3.7 #elif
|
Beliebig viele #elif
-Anweisungen können zwischen einem #if
,
#ifdef
oder #ifndef
und dem zugehörigen #else
oder
#endif
auftreten. Die Zeilen, die der elif
-Anweisung folgen,
werden für eine Kompilation verwendet, aber nur dann, wenn jede der folgenden
Bedingungen erfüllt ist:
- Der konstante Ausdruck in der vorherigen
#if
-Anweisung lieferte NIL, das Symbol name im vorherigenifdef
war nicht definiert oder das Symbol name in der vorherigenifndef
-Anweisung war definiert. - Die konstanten Ausdrücke in allen dazwischenliegenden
elif
-Anweisungen lieferten NIL. - Der momentane konstante Ausdruck liefert nicht NIL.
Wenn die oben genannten Bedingungen stimmen, dann werden die nachfolgenden
Anweisungen #elif
und #else
bis zum zugehörigen #endif
ignoriert.
Siehe auch #if, #ifdef, #ifndef, #else, #endif.
16.3.8 #else
|
Dies kehrt den Sinn einer bedingten Anweisung um, der sonst gestimmt hätte.
Wenn die vorhergehende Bedingung anzeigen würde, dass Zeilen eingefügt werden,
dann werden die Zeilen zwischen #else
und dem zugehörigen
#endif
ignoriert. Zeigt die vorhergehende Bedingung an, dass Zeilen
ignoriert werden, dann werden nachfolgende Zeilen für die Kompilation
eingefügt.
Bedingte Anweisungen und dazugehörige #else
-Anweisungen können
verschachtelt werden. Es gibt jedoch eine maximale Verschachteltiefe von 16
verschachtelten bedingten Anweisungen.
Siehe auch #if, #ifdef, #ifndef, #elif, #endif.
16.3.9 #endif
|
Beendet einen Bereich von Zeilen, der mit einer der bedingten Anweisungen #if
,
#ifdef
oder #ifndef
beginnt. Jeder dieser Anweisungen muss
eine zugehörige #endif
-Anweisung besitzen.
Siehe auch #if, #ifdef, #ifndef, #elif, #else.
16.4 Programmiersprache
BeeBase verwendet eine Programmiersprache mit einen lisp-ähnlichen Aufbau.
Tatsächlich sind einige Konstrukte und Funktionen vom Standard-Lisp entnommen
worden. BeeBase ist jedoch nicht vollständig kompatibel zu Standard-Lisp.
Viele Funktionen fehlen (z.B. destruktive Befehle) und die Bedeutung einiger
Befehle unterscheiden sich (z.B. der Befehl return
).
16.4.1 Warum Lisp? | Die Vorteile von Lisp. | |
16.4.2 Lisp-Aufbau | Aufbau der Programmiersprache. | |
16.4.3 Programmarten | Verschiedene verwendete Arten von Programmen in BeeBase. | |
16.4.4 Namenskonventionen | Namenskonventionen für Programmsymbole. | |
16.4.5 Datensatzinhalte ansprechen | Felder und Tabellen in Programmen verwenden. | |
16.4.6 Datentypen zum Programmieren | Verfügbare Datentypen zum Programmieren. | |
16.4.7 Konstanten | Konstante Ausdrücke. | |
16.4.8 Befehlsaufbau | Aufbau der Beschreibung aller Befehle. |
16.4.1 Warum Lisp?
Der Vorteil einer lisp-ähnlichen Sprache ist, dass man sowohl funktional als auch imperativ programmieren kann. Funktionale Sprachen sind in mathematischen Anwendungen weit verbreitet. Das Grundelement von funktionalen Sprachen ist die Verwendung von Ausdrücken. Funktionen werden in mathematischer Schreibweise definiert und häufig wird Rekursion benutzt.
Imperative Programmiersprachen (wie C, Pascal, Modula) benutzen eine Befehlsvorschrift (oder Zustandsänderungsvorschrift), wie etwas berechnet werden soll. Hier ist das Grundelement der Zustand (z.B. Variablen) und ein Programm berechnet dessen Ausgabe durch den Wechsel von einem Zustand in einen anderen (z.B. durch Zuweisen von Werten an Variablen).
Lisp kombiniert beide Techniken und deshalb kann man auswählen, auf welche Art etwas implementiert werden soll. Man verwendet diejenige, die besser zum vorgegebenen Problem passt oder die man lieber mag.
16.4.2 Lisp-Aufbau
Ein lisp-Ausdruck ist entweder eine Konstante, eine Variable oder ein
Funktionsausdruck.
Beim Funktionsaufruf verwendet Lisp eine Prefix-Notation.
Die Funktion und seine Parameter werden von runden Klammern eingeschlossen.
Um zum Beispiel zwei Werte a
und b
zu addieren, schreibt man
(+ a b) |
Alle Ausdrücke liefern einen Wert, z.B. im obigen Beispiel die Summe von
a
und b
.
Ausdrücke können verschachtelt werden, d.h. man kann Ausdrücke als
Unterausdruck in eine andere einsetzen.
Funktionen werden nach dem call-by-value-Schema aufgerufen, was bedeutet, dass zuerst die Parameter berechnet werden, bevor die Funktion aufgerufen wird.
Wenn nicht anders angegeben, sind alle Funktionen strikt, d.h. alle
Parameter einer Funktion müssen zuerst ermittelt werden, bevor sie an die
Funktion übergeben und diese ausgeführt wird. Einige Funktionen sind jedoch
nicht strikt, z.B. IF
, AND
und OR
. Diese Funktionen
brauchen nicht alle Parameter ermitteln.
16.4.3 Programmarten
BeeBase kennt drei Programmarten. Die erste ist das Projektprogramm. Im Programm dieser Art können Funktionen und globale Variablen definiert werden. Die Funktionen können als Auslösefunktionen für Felder verwendet werden. Ein Projektprogramm wird im Programmeditor (siehe Programmeditor) festgelegt.
Die zweite Art ist das Abfrageprogramm. FÜr dieses können nur Ausdrücke eingegeben werden. Ein solcher Ausdruck darf globale Variablen enthalten und Funktionen aufrufen, die im Projektprogramm definiert wurden. Man kann jedoch in einem Abfrageprogramm keine neuen globalen Variablen und Funktionen festlegen. Abfrageprogramme werden im Abfrageeditor (siehe Abfrageeditor) eingegeben.
Die dritte Programmart sind Filterausdrücke. Hier lassen sich nur Ausdrücke eingeben, die vordefinierte BeeBase-Funktionen aufrufen. Es sind nicht alle vordefinierten Funktionen verfügbar und zwar nur solche die keine Seiteneffekte aufweisen, z.B. kann man keine Funktion verwenden, die Daten in eine Datei schreibt. Filterausdrücke werden im Filterfenster (siehe Filter ändern) verändert.
16.4.4 Namenskonventionen
In einem BeeBase-Programm können Symbole, wie Funktionen, lokale und globale Variablen, definiert werden. Die Namen dieser Symbole müssen folgenden Punkten genügen:
- das erste Zeichen eines Namens muss ein Kleinbuchstabe sein. Dies unterscheidet Programmsymbole von Tabellen- und Feldnamen.
- die folgenden Zeichen können Buchstaben (groß oder klein), Ziffern und Unterstriche sein. Andere Zeichen wie z.B. deutsche Umlaute sind nicht zulässig.
16.4.5 Datensatzinhalte ansprechen
Um auf Tabellen und Felder in einem BeeBase-Programm zugreifen zu können, muss ein Pfad zu diesen angegeben werden. Ein Pfad ist eine durch Punkte getrennte Liste von Komponenten, wobei jede Komponente der Name einer Tabelle oder eines Feldes ist.
Pfade können entweder relativ oder absolut sein. Absolute Pfade beginnen mit dem Tabellennamen als erste Komponente, gefolgt von einer Liste von Feldern, die zum gewünschten Feld hinführen, auf das man zugreifen möchte. Zum Beispiel greift der absolute Pfad `Person.Name' auf das Feld `Name' im aktuellen Datensatz der Tabelle `Person' zu oder der absolute Pfad `Person.Vater.Name' auf das Feld `Name' in dem Datensatz, der durch das Feld `Vater' referenziert wird (der ein Beziehungsfeld zur Tabelle `Person' ist).
Relative Pfade haben schon eine aktuelle Tabelle, auf die sie sich beziehen. Zum Beispiel ist in einem Filterausdruck die aktuelle Tabelle diejenige, für die der Filterausdruck geschrieben wird. Der relative Pfad für ein Feld in der aktuellen Tabelle ist dann nur der Feldname selbst. Auf Felder, auf die nicht direkt von der aktuellen Tabelle aus zugegriffen werden kann, sondern indirekt über eine Beziehung, dann gelten die gleichen Regeln wie für absolute Pfade.
Es ist nicht immer eindeutig, ob ein angegebener Pfad ein relativer oder ein absoluter ist, z.B. bei einem Filterausdruck für eine Tabelle, das ein Feld `Bar' besitzt, wenn es auch eine Tabelle `Bar' gibt. Wird nun `Bar' eingegeben, dann ist unklar, was gemeint ist: die Tabelle oder das Feld? Daher werden alle Pfade zuerst als relative Pfade betrachtet. Wird kein Feld für den angegebenen Pfad gefunden, dann wird der Pfad global betrachtet. In unserem Beispiel würde das Feld bevorzugt.
Was aber, wenn im Beispiel oben auf die Tabelle zugegriffen werden soll? In dem Fall muss der Pfad absolut angegeben werden. Um einen Pfad als global zu kennzeichnen, müssen vor dem Pfad zwei Doppelpunkte angefügt werden. In unserem Beispiel müsste man `::Bar' eingeben, um auf die Tabelle zuzugreifen.
Um Pfade und ihre Anordnungen besser zu verstehen, betrachten wir hier als Beispiel, dass das Feld `Bar' in der Tabelle `Foo' eine Beziehung zur Tabelle `Bar' ist und die Tabelle `Bar' enthält ein Feld `Name'. Nun kann man auf das Feld `Name' zugreifen, indem man `Bar.Name' oder `::Bar.Name' eingibt. Beide Ausdrücke haben unterschiedliche Bedeutungen. `::Bar.Name' bedeutet, dass der aktuelle Datensatz der Tabelle `Bar' hergenommen wird und der Wert des Feldes `Name' in diesem Datensatz zurückgeliefert wird, wohingegen `Bar.Name' den aktuellen Datensatz von `Foo' hernimmt, die Beziehung des Feldes `Bar' ermittelt und diesen Datensatz zum Ermitteln des Wertes vom Feld `Name' verwendet.
Um ein komplexeres Beispiel anzubringen, stellen wir uns vor, dass die Tabelle `Bar' zwei Datensätze hat. Der eine enthält im Feld `Name' den Eintrag `Ralph' und der andere `Steffen'. Der erste Datensatz ist der momentan aktive. Des weiteren hat die Tabelle `Foo' einen Datensatz (den aktuellen), dessen Feld `Bar' auf den zweiten Datensatz der Tabelle `Bar' verweist. `::Bar.Name' liefert jetzt `Ralph' und `Bar.Name' liefert `Steffen'.
16.4.6 Datentypen zum Programmieren
Die Programmiersprache von BeeBase kennt die folgenden Datentypen:
Typ Beschreibung
Boolesch alle Ausdrücke. Nicht-NIL-Ausdrücke werden als TRUE betrachtet.
Integer lange Ganzzahl, 32 bit, Auswahlwerte werden automatisch in
Integer umgewandelt
Real double, 64 bit
String Zeichenketten von unterschiedlicher Länge
Memo wie Zeichenketten, aber zeilenorientiertes Format
Date Datumswerte
Time Zeitwerte
Record Zeiger auf einen Datensatz
File Dateideskriptor zum Lesen/Schreiben
List Liste von Elementen, NIL ist eine leere Liste.
|
Alle Programmiertypen unterstützen den Wert NIL.
16.4.7 Konstanten
Die Programmiersprache von BeeBase kann konstante Ausdrücke handhaben, die abhängig von ihrem Typ eingegeben werden kann:
Typ Beschreibung
Integer Ganzzahlkonstanten im Bereich von -2147483648 bis
2147483647 können wie üblich angegeben werden.
Werte, die mit 0 beginnen, werden als Octalzahlen
interpretiert, Werte, die mit 0x beginnen, als
Hexadezimalzahlen.
Real Fließkommazahlen im Bereich von -3.59e308 bis
3.59e308 können wie üblich angegeben werden, sowohl
im wissenschaftlichen als auch nicht-wissenschaft-
lichen Format. Wird der Dezimalpunkt vergelassen,
so wird die Zahl nicht als Real betrachtet, sondern
als Integer.
String Zeichenkettenkonstanten sind jedes Zeichen in einer
Kette, umschlossen mit doppelten Anführungsstrichen,
z.B."Beispielzeichenkette". Innerhalb der doppelten
Anführungszeichen kann jedes Zeichen angegeben werden,
mit Ausnahme von Steuerzeichen und neuen Zeilen. Es
gibt jedoch besondere Escapezeichen zum Eingeben
solcher Zeichen:
\n neue Zeile (nl)
\t horizontaler Tabulator (ht)
\v vertikaler Tabulator (vt)
\b Rückschritt (bs)
\r Wagenrücklauf (cr)
\f Seitenumbruch (ff)
\\ der Backslash selbst
\" doppeltes Anführungszeichen
\e Escapezeichen 033
\nnn Zeichen mit dem Oktalcode nnn
\xnn Zeichen mit dem Hexcode nn
Memo Wie Zeichenkettenkonstanten.
Date Konstante Datumswerte können in einem der Formate
`TT.MM.JJJJ', `MM/TT/JJJJ' oder `JJJJ-MM-TT'
angegeben werden, wobei `TT', `MM' und `JJJJ'
die zwei- und vierstelligen Werte für Tag, Monat
bzw. Jahr darstellen.
Time Konstante Zeitwerte werden im Format `HH:MM:SS' angegeben,
wobei `HH' die Stunden, `MM' die Minuten und `SS'
die Sekunden repräsentieren.
|
Für andere vordefinierte Konstanten, siehe Vordefinierte Konstanten.
16.4.8 Befehlsaufbau
Im Rest dieses Kapitels findet man die Beschreibung aller Befehle und Funktionen, die für die Programmierung von BeeBase zur Verfügung stehen. Der folgende Aufbau wird verwendet, um die Befehle zu beschreiben:
- Text innerhalb von [] ist optional. Wird der Text innerhalb der Klammern weggelassen, dann wird ein Vorgabewert angenommen.
- Texte, die durch senkrechte Striche | getrennt werden, geben verschiedene Optionen an. Z.B. bedeutet `a | b', dass entweder `a' oder `b' angegeben werden kann.
- Text, der im Schriftstil var geschrieben wird, ist ein Platzhalter, der mit anderen Ausdrücken gefüllt werden kann.
- Punkte ... zeigen an, dass weitere Ausdrücke folgen können.
- jeder andere Text ist obligatorisch.
Anm.d.Übersetzers: Bei der Beschreibung der Befehle wird die englische Namensgebung der Parameter etc. beibehalten. Dies vermeidet Fehler bei der Übersetzung und bleibt dennoch verständlich.
16.5 Befehle definieren
Dieser Abschnitt listet Befehle zum Definieren von Funktionen und globalen Variablen auf. Die Befehle sind nur für Projektprogramme verfügbar.
16.5.1 DEFUN | Funktionsdefinition. | |
16.5.2 DEFUN* | Funktionsdefinition mit verstecktem Namen. | |
16.5.3 DEFVAR | Variablendefinition. | |
16.5.4 DEFVAR* | Variable, die ihren Wert behält. |
16.5.1 DEFUN
DEFUN
definiert eine Funktion mit einem festgelegten Namen, einer
Liste von Parametern, die an die Funktion weitergereicht und eine
Liste von Ausdrücken, die abgearbeitet werden.
|
Der Name der Funktion muss mit einem Kleinbuchstaben beginnen, gefolgt von weiteren Zeichen, Ziffern und Unterstrich-Zeichen. (siehe Namenskonventionen).
Der Parameter varlist legt die Parameter der Funktion fest:
varlist: var1 ... |
wobei var1 ... die Namen der Parameter sind. Die Namen müssen den gleichen Regeln wie die des Funktionsnamens genügen.
Es ist auch möglich, Typdeklarierer an die Parameter zu hängen (siehe Typdeklarierer).
Die Funktion führt die Ausdrücke expr, ... der Reihe nach aus und liefert den Wert des letzten Ausdrucks. Die Funktion kann auch weitere Funktionen einschließlich sich selbst aufrufen. Eine selbstdefinierte Funktion wird wie eine vordefinierte Funktion aufgerufen.
Um zum Beispiel die Anzahl der Elemente einer Liste zu zählen, kann folgende Funktion definiert werden:
(DEFUN len (l) (IF (= l NIL) 0 (+ 1 (len (REST l))) ) ) |
Mit DEFUN
definierte Funktionen werden in Popuplisten von Tabellen- und
Feldfenstern aufgelistet
(siehe Tabellen erstellen und
Felder erstellen).
Dieser Befehl ist nur für Projektprogramme verfügbar.
16.5.2 DEFUN*
DEFUN*
ist die Stern-Variante von DEFUN
und hat den selben
Effekt wie DEFUN
(siehe DEFUN).
Der einzige Unterschied ist, dass Funktionen, die mit DEFUN*
definiert
wurden, beim Erzeugen oder Ändern von Tabellen und Feldern nicht in den
Popuplisten aufgelistet werden.
Es ist jedoch möglich, den Funktionsnamen in den entsprechenden
Zeichenkettenfeldern einzugeben.
Dieser Befehl ist nur für Projektprogramme verfügbar.
16.5.3 DEFVAR
|
Definiert eine globale Variable mit dem Vorgabewert aus expr oder NIL, wenn expr fehlt. Der Name der Variablen muss mit einem Kleinbuchstaben beginnen, gefolgt von weiteren Zeichen, Ziffern und Unterstrich-Zeichen. (siehe Nameskonventionen).
Man kann Typdeklarierer an den Variablennamen anhängen (siehe Typdeklarierer).
DEFVAR
ist nur verfügbar für Projektprogramme.
Alle DEFVAR
-Befehle sollten am Anfang vor allen Funktionsdefinitionen
plaziert werden.
Nach Beenden einer Trigger-Funktion (wenn BeeBase zum Benutzer-Interface
zurückschaltet) geht der Inhalt aller globaler Variablen verloren.
Diese werden beim nächsten Aufruf einer Auslösefunktion
neu mit ihrem Vorgabewert expr initialisiert.
Ist dies nicht erwünscht, so kann der Befehl DEFVAR*
(siehe DEFVAR*) verwendet werden, welcher es erlaubt,
den Inhalt globaler Variablen zwischen den Aufrufen zu speichern.
Bitte verwenden Sie globale Variablen sparsam (oder gar nicht). Alle globalen Variablen müssen bei jedem externen Aufruf einer Auslösefunktion neu initialisiert (und expr ausgewertet, wenn gegeben) werden.
Beispiel: `(DEFVAR x 42)' definiert eine globale Variable `x' mit dem Wert 42.
Es gibt einige vordefinierte Variablen in BeeBase (siehe Vordefinierte Variablen).
Siehe auch DEFVAR*, DEFUN, DEFUN*, LET.
16.5.4 DEFVAR*
|
DEFVAR*
hat den gleichen Effekt wie der DEFVAR
-Befehl
(siehe DEFVAR) nur dass eine mit DEFVAR*
definierte Variable
nicht ihren Inhalt bei Programmende verliert.
Bei dem ersten Programmaufruf wird var mit dem Ausdruck expr
oder NIL (falls expr fehlt) initialisiert.
In allen weiteren Aufrufen wird expr nicht nocheinmal ausgewertet
sondern der Wert von var aus dem letzten Aufruf verwendet.
Dadurch ist es möglich, Informationen von einem Programmaufruf zum
nächsten zu übermitteln, ohne Daten in externen Dateien oder in einer
Datenbank-Tabelle zu speichern. Zu beachten ist aber, dass alle
mit DEFVAR*
definierten Variablen bei jeder Programmübersetzung
ihren Wert verlieren. Falls Daten permanent gespeichert werden sollen,
verwenden Sie hierfür ein (vorzugsweise verstecktes) Feld in einer Tabelle.
Siehe auch DEFVAR, DEFUN, DEFUN*, LET.
16.6 Programmsteuerungsfunktionen
Dieser Abschnitt listet Funktionen zur Programmflusskontrolle auf, z.B. Funktionen zum Definieren von lokalen Variablen, Schleifenfunktionen, bedingte Programmausführung, Schleifenkontrollfunktionen und mehr.
16.6.1 PROGN | Verbundbefehl, liefert letzten Ausdruck. | |
16.6.2 PROG1 | Verbundbefehl, liefert ersten Ausdruck. | |
16.6.3 LET | Definition lokaler Variablen. | |
16.6.4 SETQ | Setzen von Variablen, Feldern und Tabellen. | |
16.6.5 SETQ* | Setzen von Variablen, Feldern und Tabellen. | |
16.6.6 SETQLIST | Listen-Version von SETQ. | |
16.6.7 SETQLIST* | Listen-Version von SETQ*. | |
16.6.8 FUNCALL | Funktionsaufruf mit Argumenten. | |
16.6.9 APPLY | Funktionsanwendung auf Argumentenliste. | |
16.6.10 IF | If-then-else bedingte Programmausführung. | |
16.6.11 CASE | Switch-case bedingte Programmausführung. | |
16.6.12 COND | Leistungsfähige bedingte Programmausführung. | |
16.6.13 DOTIMES | Schleife über einen Bereich von Ganzzahlen. | |
16.6.14 DOLIST | Schleife über eine Liste. | |
16.6.15 DO | Gewöhnliche Schleife. | |
16.6.16 FOR ALL | Schleife über eine Menge von Datensätzen. | |
16.6.17 NEXT | Zur nächsten Schleifenausführung springen. | |
16.6.18 EXIT | Schleife verlassen. | |
16.6.19 RETURN | Rückkehr von einer Funktion. | |
16.6.20 HALT | Programmausführung anhalten. | |
16.6.21 ERROR | Programmausführung mit Fehlermeldung abbrechen. |
16.6.1 PROGN
Um mehrere Ausdrücke der Reihe nach auszuführen,
wird der PROGN
-Aufruf verwendet.
|
führt expr ... der Reihe nach aus.
Liefert das Ergebnis des letzten Ausdrucks (oder NIL, wenn kein Ausdruck
angegeben wurde).
In Lisp ist dieser Aufruf als (PROGN
[expr ...])
bekannt.
Beispiel: `(1 2 3 4)' liefert 4.
Siehe auch PROG1.
16.6.2 PROG1
Neben PROGN
gibt es mit PROG1
eine andere Möglichkeit, mehrere
Ausdrücke zu errechnen.
|
führt expr ... aus und liefert den Wert des ersten Ausdrucks (oder NIL, wenn kein Ausdruck angegeben wurde).
Beispiel: `(PROG1 1 2 3 4)' liefert 1.
Siehe auch PROGN.
16.6.3 LET
LET
definiert einen neuen Block von lokalen Variablen.
Dies ist nützlich, um z.B. lokale Variablen einer Funktion zu definieren.
Der Aufbau ist:
|
wobei varlist eine Liste von lokalen Variablen ist.
varlist: varspec ... |
varspec: |
Hier ist var der Name der Variable, der mit einem Kleinbuchstaben beginnt, gefolgt von weiteren Zeichen, Ziffern und Unterstrich-Zeichen. (siehe Namenskonventionen).
Im Falle von (
var expr)
wird die neue Variable mit
dem gegebenen Ausdruck initalisiert.
Im anderen Fall ist die neue Variable auf NIL gesetzt.
Es ist auch möglich, Typdeklarierer an die Variablen zu hängen (siehe Typdeklarierer).
Nach dem Initialisieren aller Variablen wird die Liste der Ausdrücke expr ... ausgewertet und der Wert der letzten zurückgegeben.
Der folgende LET
-Ausdruck
(LET ((x 0) y (z (+ x 1))) (+ x z) ) |
liefert zum Beispiel 1.
Siehe auch DOTIMES, DOLIST, DO, DEFVAR.
16.6.4 SETQ
Die Funktion SETQ
setzt Werte in Variablen, Feldern und Tabellen.
|
Setzt lvalue1 auf den Wert von expr. Die Punkte zeigen
weitere Zuweisungen für lvalues an. Ein lvalue ist eine Variable,
ein Feld einer Tabelle oder eine Tabelle.
Im Falle einer Variable muss diese voher definiert worden sein (z.B. mit dem
LET
-Ausdruck).
Setzen des Wertes einer Tabelle bedeutet das Setzen seines Programm- oder
Oberflächen-Datensatzzeigers:
`(SETQ
Table expr)
' setzt
den Programm-Datensatzzeiger von Table auf den Wert von expr und
`(SETQ
Table* expr)
' setzt dessen
Oberflächen-Datensatzzeiger und aktualisiert die Anzeige. Mehr Informationen
über Programm- und Oberflächen-Datensatzzeigern,
siehe Tabellen.
SETQ
liefert den Wert des letzten Ausdrucks.
Beispiel: `(SETQ a 1 b 2)' weist 1 der Variable `a' zu, 2 der Variable `b' und liefert 2.
Siehe auch SETQ*, LET, DEFVAR, Tabellen, Aufbau von Ausdrücken.
16.6.5 SETQ*
SETQ*
ist die Stern-Variante von SETQ
(siehe SETQ) und hat
ähnliche Auswirkungen. Der Unterschied ist, dass SETQ*
beim Zuweisen
eines Wertes zu einer Variable die Auslösefunktion dieses Feldes aufruft
(siehe Auslösefunktion Feld),
statt den Wert direkt zuzuweisen.
Ist zum Feld keine Auslösefunktion zugewiesen, dann verhält sich SETQ*
genauso wie SETQ
und weist einfach den Wert der Variable zu.
Beispiel: `(SETQ* Table.Field 0)' ruft die Auslösefunktion von `Table.Field' mit dem Parameter 0 auf.
Achtung: Mit dieser Funktion ist es möglich, Endlosschleifen zu schreiben,
z.B. wenn eine Auslösefunktion für ein Feld definiert wurde und diese
Funktion SETQ*
aufruft, das sich selbst einen Wert setzt.
16.6.6 SETQLIST
SETQLIST
ist ähnlich wie SETQ
(siehe SETQ) benutzt aber eine
Liste, um mehrere `lvalue's anhand der Elemente der Liste zuzuweisen.
|
Weißt lvalue1 den Wert des ersten Elements von list-expr zu. Die Punkte deuten weitere Zuweisungen an `lvalue's von den zughörigen Listenelementen an. Die Anzahl der `lvalue's mmuss mit der Länge der Liste identisch sein, andernfalls wird die Programmausführung mit einer Fehlermeldung beendet.
Es gelten die gleiche Reglen wie in SETQ
(siehe SETQ).
Zum Beispiel sind die folgenden beiden Versionen zum Setzten von Variablen
gleichwertig:
(SETQLIST a b c (LIST 1 2 3)) (SETQ a 1 b 2 c 3) |
SETQLIST
gibt den Wert von list-expr zurück.
16.6.7 SETQLIST*
SETQLIST*
ist die Stern-Variante von SETQLIST
(siehe SETQLIST)
und hat ähnliche Auswirkungen.
Der Unterschied ist, dass SETQLIST*
beim Zuweisen
eines Wertes zu einer Variable die Auslösefunktion dieses Feldes aufruft
(siehe Auslösefunktion Feld),
statt den Wert direkt zuzuweisen.
Ist zum Feld keine Auslösefunktion zugewiesen, dann verhält sich SETQLIST*
genauso wie SETQLIST
und weist einfach den Wert der Variable zu.
16.6.8 FUNCALL
FUNCALL
ruft eine Funktion mit Argumenten auf.
|
Ruft die Funktion fun-expr mit den gegebenen Parametern auf. Der Ausdruck fun-expr kann jeder Ausdruck sein, dessen Wert eine vor- oder benutzerdefinierte Funktion ist, z.B. eine Variable, die die Funktion enthält, die aufgerufen werden soll. Stimmt die Anzahl der Parameter nicht, dann wird eine Fehlermeldung erzeugt.
FUNCALL
liefert den Rückgabewert des Funktionsaufrufes oder NIL, wenn
fun-expr NIL ist.
Mehr Informationen über funktionale Ausdrücke, siehe Funktionale Parameter.
Siehe auch APPLY.
16.6.9 APPLY
APPLY
wendet eine Funktion auf eine Argumentenliste an.
|
Wendet die Funktion fun-expr auf eine Liste an, die dadurch
erzeugt wird, indem die Argumente expr ... mittels
cons
vorne an list-expr angehängt werden.
Anders gesagt wird die Funktion fun-expr mit den Argumenten
expr ... und list-expr, ersetzt durch seine Listenelemente,
aufgerufen.
Der Ausdruck fun-expr kann jeder Ausdruck sein, dessen Wert eine vor- oder benutzerdefinierte Funktion ist, z.B. eine Variable, die die Funktion enthält, die aufgerufen werden soll. Das letzte Argument list-expr muss eine gültige Liste oder NIL sein, sonst wird eine Fehlermeldung erzeugt. Stimmt die Anzahl der Parameter nicht, so wird ein Fehler gemeldet.
APPLY
liefert den Rückgabewert des Funktionsaufrufes oder NIL, wenn
fun-expr NIL ist.
Mehr Informationen über funktionale Ausdrücke, siehe Funktionale Parameter.
Beispiel: `(APPLY + 4 (LIST 1 2 3))' liefert 10.
Siehe auch FUNCALL.
16.6.10 IF
IF
ist ein Bedingungsoperator.
|
Der Ausdruck expr1 wird getestet. Wenn er nicht NIL liefert, dann wird der Wert von expr2 geliefert, anderenfalls der von expr3 (oder NIL, wenn nicht vorhanden).
Diese Funktion ist nicht strikt, das bedeutet, dass entweder der eine oder der andere Ausdruck ausgewertet wird.
16.6.11 CASE
CASE
ähnelt der switch
-Anweisung in der Sprache C.
|
Hier ist expr der Auswahlausdruck und case ... sind Paare bestehend aus:
case: |
wobei value ein einzelner Ausdruck oder eine Liste von Ausdrücken ist und expr ... die Ausdrücke sind, die ausgeführt werden, wenn der Fallausdruck passt.
Der Ausdruck CASE
wertet erst expr aus.
Dann wird jedes Fallpaar geprüft, ob es (oder einer der Ausdrücke in der
Liste) zum ausgewerten Ausdruck passt.
Wird ein passender Fallausdruck gefunden, dann werden die dazugehörigen
Ausdrücke ausgeführt und der Wert des letzten Ausdrucks zurückgeliefert.
Passt kein Fall, dann wird NIL zurückgeliefert.
Beispiel: `(CASE 1 ((2 3 4) 1) (1 2))' liefert 2.
16.6.12 COND
COND
ist wie IF
ein Bedingungsoperator.
|
COND
prüft der Reihe nach den ersten Ausdruck jeder Liste.
Für den ersten, der nicht NIL liefert, wird der dazugehörige Ausdruck
expr ... ausgeführt und der Wert des letzten Ausdrucks
zurückgeliefert.
Liefern alle geprüften Ausdrücke NIL, dann wird NIL zurückgegeben.
Beispiel
(COND ((> 1 2) "1 > 2") ((= 1 2) "1 = 2") ((< 1 2) "1 < 2") ) |
liefert "1 < 2".
16.6.13 DOTIMES
Für einfache Schleifen kann der Befehl DOTIMES
verwendet werden.
|
Hier ist name der Name einer neuen Variable, die innerhalb der Schleife verwendet wird. Der Name muss mit einem Kleinbuchstaben beginnen, gefolgt von weiteren Zeichen, Ziffern und Unterstrich-Zeichen. (siehe Namenskonventionen).
Die Anzahl der Schleifendurchläufe wird über int-expr angegeben. In result-expr ... können Ausdrücke angegeben werden, die nach dem Beenden der Schleife ausgeführt werden sollen. loop-expr enthält den Körper der Schleife, darin sind die Ausdrücke, die bei jedem Schleifendurchlauf ausgewertet werden.
Bevor die Schleife ausgeführt wird, errechnet DOTIMES
den Wert von
int-expr, um die Anzahl festzustellen, wie oft die Schleife ausgeführt
werden soll.
Hier wird int-expr nur einmal zu Beginn der Schleife ausgewertet und
muss einen Ganzzahlwert liefern.
Danach setzt DOTIMES
die Schleifenvariable schrittweise in jedem
Durchlauf auf 0 bis int-expr-1. Zuerst wird die Variable auf Null
gesetzt und geprüft, ob diese schon größer oder gleich dem Wert von
expr ist. Ist int-expr ist negativ oder NIL, oder ist die
Variable größer oder gleich dem Wert von expr, dann wird die Schleife
abgebrochen und die Rückgabewerte ermittelt. Anderenfalls werden die
Ausdrücke in der Schleife abgearbeitet und die Variable um eins erhöht.
Danach kehrt die Schleife wieder zum Abbruchtest zurück und führt -wenn
möglich- weitere Schleifendurchläufe aus.
Der Ausdruck DOTIMES
liefert den Wert des letzten
Rückgabewert-Ausdrucks oder NIL, wenn kein solcher angegeben wurde.
Beispiel
(DOTIMES (i 50 i) (PRINT i)) |
Gibt die Nummern von 0 bis 49 aus und liefert den Wert 50.
Siehe auch DOLIST, DO, FOR ALL, LET.
16.6.14 DOLIST
Für Schleifen über Listen kann der Ausdruck DOLIST
verwendet werden.
|
Hier ist name der Name einer neuen Variable, der in der Schleife verwendet wird. Der Name muss mit einem Kleinbuchstaben beginnen, gefolgt von weiteren Zeichen, Ziffern und Unterstrich-Zeichen. (siehe Namenskonventionen).
In list-expr wird die Liste festgelegt, über diese die Schleife ausgeführt werden soll, result-expr ... sind Ausdrücke, die nach dem Beenden der Schleife ausgeführt werden und loop-expr ... bilden den Körper der Schleife.
Bevor die Schleife ausgeführt wird, berechnet DOLIST
den Wert von
list-expr. Dieser Ausdruck wird nur einmal beim Start der Schleife
ausgewertet und muss einen Listenwert liefern.
Dann setzt DOTIMES
bei jedem Schleifendurchlauf die Schleifenvariable
der Reihe nach auf jedes Element der Liste.
Zuerst wird die Schleifenvariable mit dem ersten Element der Liste
initialisiert.
Ist die Liste schon leer (NIL), dann wird die Schleife beendet und die
Rückgabewerte berechnet.
Anderenfalls werden die Schleifenausdrücke ausgeführt und die Variable auf
das nächste Element in der Liste gesetzt.
Danach kehrt die Schleife wieder zum Abbruchtest zurück und führt -wenn
möglich- weitere Schleifendurchläufe aus.
Der Ausdruck DOLIST
liefert den Wert des letzten
Rückgabewert-Ausdrucks oder NIL, wenn kein solcher angegeben wurde.
Beispiel
(DOLIST (i (SELECT * FROM Accounts)) (PRINT i)) |
Gibt alle Datensätze der Tabelle `Accounts' aus und liefert NIL.
Siehe auch DOTIMES, DO, FOR ALL, LET.
16.6.15 DO
Mit dem Ausdruck DO
können beliebige Schleifen programmiert werden.
|
wobei binding ... die Variablenzuweisungen sind, die jeweils wie folgt aussehen können:
- ein neuer Name für eine Variable (der mit NIL vorbelegt wird)
- eine Liste der Form
(
name init [step])
mit name als Namen für eine neue Variable, init ist der Startwert der Variable und step der Ausdruck für Zählschrittweite.
Des weiteren ist term-expr der Abbruchbedingungsausdruck, result-expr ... sind die Rückgabewertausdrücke (voreingestellt ist NIL) und loop-expr ... bilden den Körper der Schleife.
Die DO
-Schleife initialisiert zuerst alle lokalen Variablen mit den
Startwerten und testet dann die Abbruchbedingung. Liefert sie TRUE, dann wird
die Schleife unterbrochen und die Rückgabewertausdrücke ausgeführt. Der Wert
des letzten Rückgabewerts wird zurückgeliefert.
Anderenfalls werden die Schleifenausdrücke (
loopexpr
...)
ausgeführt und jede Variable wird mit dem Wert der
Schrittweite aktualisiert.
Danach kehrt die Ausführung zum Test der Abbruchbedingung zurück und so
weiter.
Beispiel
(DO ((i 0 (+ i 1))) ((>= i 5) i) (PRINT i)) |
Gibt die Werte 0, 1, 2, 4 und 4 aus und liefert den Wert 5.
Natürlich ist das ein ziemlich komplizierter Weg, eine einfache FOR-Schleife
zu bauen. Dafür gibt es mit dem Ausdruck DOTIMES
eine einfachere
Version.
Siehe auch DOTIMES, DOLIST, FOR ALL, LET.
16.6.16 FOR ALL
Der Ausdruck FOR ALL
wird verwendet, um eine Liste von Datensätzen
abzuarbeiten.
|
Hier ist table-list eine durch Kommas getrennte Liste von Tabellen, where-expr ein Ausdruck zum Testen einer jeden Menge von Datensätzen, order-list eine durch Kommas getrennte Liste von Ausdrücken, nach denen sortiert werden soll und expr ... sind die Ausdrücke, die für jeden Datensatz ausgeführt werden sollen.
FOR ALL
erzeugt zuerst eine Liste aller Datensätze, für die der
Schleifenkörper ausgeführt werden soll. Dies wird wie bei einem
SELECT
-Ausdruck durchgeführt. Siehe SELECT für mehr Informationen,
wie diese Liste erzeugt wird. Für jedes Element dieser Liste wird der
Schleifenkörper expr ... ausgeführt.
Zum Beispiel kann ein Aufsummieren eines Tabellenfeldes folgendermaßen durchgeführt werden:
(SETQ sum 0) (FOR ALL Accounts DO (SETQ sum (+ sum Accounts.Amount)) ) |
Der Ausdruck FOR ALL
liefert NIL.
Siehe auch SELECT, DOTIMES, DOLIST, DO.
16.6.17 NEXT
NEXT
kann verwendet werden, um DOTIMES
-,
DOLIST
-, DO
- und FOR ALL
-Schleifen zu steuern.
Ein Aufruf von NEXT
im Schleifenkörper springt zum nächsten
Schleifendurchlauf. Dies kann benutzt werden, wenn uninteressante
Schleifendurchläufe übersprungen werden sollen, wie z.B. in folgendem
Beispiel:
(FOR ALL Table DO (IF nicht-interessant-im-aktuellen-Datensatz (NEXT)) ... ) |
Siehe auch EXIT, DOTIMES, DOLIST, DO, FOR ALL.
16.6.18 EXIT
EXIT
kann verwendet werden, um eine Schleife zu beenden.
|
EXIT
innerhalb eines Schleifenkörpers beendet die Schleife und
führen die optionalen Ausdrücke expr ... aus und liefern den Wert
des letzten Ausdrucks (oder NIL, wenn kein Ausdruck angegeben wurde) als
Rückgabewert der Schleife.
Mögliche Rückgabewerte der Schleife im Beispiel
(DOTIMES (x 10 ret-expr ...) ...) |
werden nicht ausgeführt.
Man kann die Funktion EXIT
z.B. verwenden, um eine FOR
ALL
-Schleife zu beenden, wenn ein Datensatz gefunden wurde, der uns
interessiert:
(FOR ALL Table DO (IF interessanter-aktueller-Datensatz (EXIT Table)) ... ) |
Siehe auch NEXT, RETURN, HALT, DOTIMES, DOLIST, DO, FOR ALL.
16.6.19 RETURN
Innerhalb einer Funktionsdefinition kann mit dem Befehl RETURN
zur
aufrufenden Funktion zurückgesprungen werden.
|
beendet die Funktion, führt die optionalen Ausdrücke expr ... aus und liefert den Wert des letzten Ausdrucks (oder NIL, wenn kein Ausdruck angegeben wurde).
Beispiel
(DEFUN find-record (name) (FOR ALL Table DO (IF (= Name name) (RETURN Table)) ) ) |
Das Beispiel sucht nach einem Datensatz, dessen Feld Name zum gegebenen Namen passt. Die Funktion liefert den ersten Datensatz, der gefunden wurde oder NIL, wenn kein Datensatz gefunden wurde.
16.6.20 HALT
HALT
kann verwendet werden, um die Programmausführung abzubrechen.
|
stoppt stillschweigend die Programmausführung.
Siehe auch ERROR, EXIT, RETURN.
16.6.21 ERROR
Zum Abbrechen der Programmausführung mit einer Fehlermeldung kann die
Funktion ERROR
verwendet werden.
|
stoppt die Programmausführung und öffnet ein Fenster mit einer Fehlermeldung.
Die Fehlermeldung wird wie in der Funktion SPRINTF
(siehe SPRINTF)
aus fmt und den optionalen Parametern arg ... erzeugt.
16.7 Typaussagen
Für jeden Datentyp ist eine Aussage definiert, die TRUE liefert, wenn der übergebene Ausdruck vom gegebenen Typ ist, anderenfalls NIL. Die Aussagen sind:
Aussage Beschreibung
|
16.8 Typumwandlungsfunktionen
Dieser Abschnitt listet Funktionen auf, die zum Umwandeln von einem Datentyp in einen anderen verwendet werden.
16.8.1 STR | Umwandlung in eine Zeichenkette. | |
16.8.2 MEMO | Umwandlung in einen mehrzeiligen Text. | |
16.8.3 INT | Umwandlung in eine Ganzzahl. | |
16.8.4 REAL | Umwandlung in eine Fließkommazahl. | |
16.8.5 DATE | Umwandlung in ein Datum. | |
16.8.6 TIME | Umwandlung in eine Zeit. |
16.8.1 STR
STR
kann verwendet werden, um einen Ausdruck in eine
Zeichenkettendarstellung umzuwandeln.
|
wandelt expr in eine Zeichenkettendarstellung um. Der Typ von expr bestimmt die Umwandlung:
Typ Ergebniszeichenkette
Zeichenkette Die Zeichenkette selbst.
mehrzeiliger Text Der gesamte mehrzeilige Text in einer Zeichenkette.
Ganzzahl Zeichenkettendarstellung einer Ganzzahl.
Fließkommazahl Zeichenkettendarstellung einer Fließkommazahl.
Wenn expr ein Feld ist, dann wird die Anzahl
der Nachkommastellen dieses Feldes, anderenfalls
zwei Ziffern verwendet.
Auswahl Auswahltext des Auswahlfeldes.
Datum Zeichenkettendarstellung des Datumswertes.
Zeit Zeichenkettendarstellung des Zeitwertes.
Boolesch Die Zeichenkette "TRUE"
NIL Benutzerdefinierte Zeichenkette für NIL, wenn
expr ein Feld ist, anderenfalls die
Zeichenkette "NIL"
Datensatz Zeichenkettendarstellung der Datensatznummer.
Andere Zeichenkettendarstellung des internen Adresszeigers.
|
16.8.2 MEMO
MEMO
kann verwendet werden, um einen Ausdruck in einen mehrzeiligen
Text umzuwandeln.
|
wandelt expr in eine mehrzeilige Textdarstellung.
Es fasst den Ausdruck wie bei der Funktion STR
(siehe STR) auf,
liefert aber einen mehrzeiligen Text statt einer Zeichenkette.
Siehe auch STR.
16.8.3 INT
INT
wird verwendet, um einen Ausdruck in eine Ganzzahl umzuwandeln.
|
wandelt expr in eine Ganzzahl. Mögliche Umwandlungen sind:
Typ Ergebniswert
Zeichenkette Wenn die gesamte Zeichenkette eine Ganzzahl darstellt,
dann wird die Zeichenkette in eine Ganzzahl umgewandelt.
Beginnt die Zeichenkette mit 0, so wird sie als Oktalzahl
interpretiert, beginnt sie mit 0x, als Hexadezimalzahl.
Führende und folgende Leerzeichen werden ignoriert.
Stellt die Zeichenkette keine Ganzzahl dar, so wird NIL
geliefert.
mehrzeiliger Text Analog zu Zeichenkette.
Ganzzahl Der Wert selbst.
Fließkommazahl Wenn der Wert im Ganzzahlbereich liegt, wird der
gerundetet Fließkommawert geliefert, anderenfalls NIL.
Auswahltext Die interne Nummer (beginnend bei 0) des Auswahltextes.
Datum Anzahl Tage seit dem 01.01.0000.
Zeit Anzahl Sekunden seit 00:00:00.
Datensatz Datensatznummer.
NIL NIL
Andere Eine Fehlermeldung wird erzeugt und die Programmaus-
führung wird abgebrochen.
|
16.8.4 REAL
REAL
wird verwendet, um einen Ausdruck in einen Wert vom Typ
Fließkommazahl umzuwandeln.
|
wandelt expr in eine Fließkommazahl.
Es fasst den Ausdruck wie bei der Funktion INT
(siehe INT) auf,
liefert aber einen Wert vom Typ Fließkommazahl anstatt einer Ganzzahl.
Siehe auch INT.
16.8.5 DATE
DATE
wird verwendet, um einen Ausdruck in ein Datum umzuwandeln.
|
wandelt den gegebenen Ausdruck in ein Datum. Mögliche Umwandlungen sind:
Typ Ergebniswert
Zeichenkette Wenn die gesamte Zeichenkette einen Datum darstellt,
dann wird die Zeichenkette in ein Datum umgewandelt.
Führende und folgende Leerzeichen werden ignoriert.
Stellt es kein Datum dar, wird NIL geliefert.
mehrzeiliger Text Analog zu Zeichenkette.
Ganzzahl Ein Datumswert wird erzeugt, der die gegebene Ganzzahl
als die Anzahl der Tage seit dem 01.01.0000 darstellt.
Ist die Ganzzahl zu groß (Datum würde größer als der
31.12.9999) oder negativ, dann wird NIL zurückgegeben.
Fließkommazahl Analog zu Ganzzahl.
Datum Der Wert selbst.
NIL NIL
Andere Eine Fehlermeldung wird erzeugt und die Programmaus-
führung wird abgebrochen.
|
Siehe auch DATEDMY.
16.8.6 TIME
TIME
wird verwendet, um einen Ausdruck in einen Zeitwert umzuwandeln.
|
wandelt den gegebenen Ausdruck in einen Zeitwert. Mögliche Umwandlungen sind:
Typ Ergebniswert
Zeichenkette Wenn die gesamte Zeichenkette einen Zeitwert darstellt,
dann wird die Zeichenkette in eine Zeit umgewandelt.
Führende und folgende Leerzeichen werden ignoriert.
Stellt es keine Zeit dar, wird NIL geliefert.
mehrzeiliger Text Analog zu Zeichenkette.
Ganzzahl Ein Zeitwert wird erzeugt, der die gegebene Ganzzahl
als Anzahl der Sekunden seit 00:00:00 darstellt.
Fließkommazahl Analog zu Ganzzahl.
Zeit Der Wert selbst.
NIL NIL
Andere Eine Fehlermeldung wird erzeugt und die Programmaus-
führung wird abgebrochen.
|
16.9 Boolesche Funktionen
Dieser Abschnitt listet die booleschen Operatoren auf.
16.9.1 AND | Vereinigung von Booleschen Werten. | |
16.9.2 OR | Verknüpfung von Booleschen Werten. | |
16.9.3 NOT | Invertierung eines Booleschen Wertes. |
16.9.1 AND
AND
prüft, ob alle seine Parameter TRUE sind.
|
prüft der Reihe nach expr ..., bis ein Ausdruck zu NIL wird. Sind alle Ausdrücke zu Nicht-NIL aufgelöst worden, dann wird der Wert des letzten Ausdrucks zurückgeliefert, anderenfalls NIL.
Diese Funktion ist nicht strikt, dies bedeutet, dass nicht alle Parameter von
AND
ausgewertet werden müssen, z.B. wird in `(AND NIL (+ 1 2))'
der Ausdruck `(+ 1 2)' nicht ausgewertet, da ein NIL-Wert schon
ermittelt wurde. In `(AND (+ 1 2) NIL)' jedoch wird der Ausdruck
`(+ 1 2)' ausgewertet.
16.9.2 OR
OR
prüft, ob alle seiner Parameter NIL sind.
|
prüft der Reihe nach expr ..., bis ein Ausdruck zu Nicht-NIL wird. Liefert den Wert des ersten Ausdrucks, der zu Nicht-NIL wurde, oder NIL, wenn alle Ausdrücke zu NIL wurden.
Diese Funktion ist nicht strikt, dies bedeutet, dass nicht alle Parameter von
AND
ausgewertet werden müssen, z.B. wird in `(OR TRUE (+ 1 2))'
der Ausdruck `(+ 1 2)' nicht ausgewertet, da ein Nicht-NIL-Wert (hier
TRUE) schon ermittelt wurde. In `(OR (+ 1 2) TRUE)' jedoch wird der
Ausdruck `(+ 1 2)' ausgewertet.
16.9.3 NOT
NOT
wird verwendet, um den Wert eines Booleschen Ausdrucks zu
invertieren.
|
liefert TRUE, wenn expr NIL ist, sonst NIL.
16.10 Vergleichsfunktionen
In diesem Abschnitt findet man Funktionen zum Vergleich von Werten vor.
16.10.1 Relationsoperatoren | =, <>, <, >, <=, >= und ihre Versionen mit Stern. | |
16.10.2 CMP | Liefert eine Ganzzahl, die eine Sortierung repräsentiert. | |
16.10.3 CMP* | Erweiterter Vergleich, z.B. zeichengrößenunabhängig | |
16.10.4 MAX | Maximum-Ausdruck. | |
16.10.5 MAX* | Maximum-Ausdruck mit erweiterter Ordnung. | |
16.10.6 MIN | Minimum-Ausdruck. | |
16.10.7 MIN* | Minimum-Ausdruck mit erweiterter Ordnung. |
16.10.1 Relationsoperatoren
Zum Vergleichen zweier Werte in einem BeeBase-Programm verwendet man
|
wobei op einer aus {=
, <>
, <
, >
, >=
,
<=
, =*
, <>*
, <*
, >*
, >=*
, <=*
}
ist.
Der Stern wird für besondere Vergleiche (Zeichenkettenvergleiche ohne
Groß-/Kleinschreibung, Datensatzvergleich mit der benutzerdefinierten
Reihenfolge) verwendet.
Die folgende Tabelle zeigt alle Regeln beim Vergleich von zwei Werten in einem BeeBase-Programm.
Typ Vergleichsreihenfolge
Ganzzahl NIL < MIN_INT < ... < -1 < 0 < 1 < ... < MAX_INT
Fließkommazahl NIL < -HUGE_VAL < ... < -1.0 < 0.0 < 1.0 < ... < HUGE_VAL
Zeichenkette NIL < "" < "Z" < "a" < "aa" < "b" < ... (mit groß/klein)
NIL <* "" <* "a" <* "AA" <* "b" < ... (groß/klein egal)
mehrzeiliger Text wie bei Zeichenketten
Datum NIL < 1.1.0000 < ... < 31.12.9999
Zeit NIL < 00:00:00 < ... < 596523:14:07
Boolesch NIL < TRUE
Datensatz NIL < jeder_Datensatz (Datensätze selbst können nicht
mit < verglichen werden)
NIL <* rec1 <* rec2 (Reihenfolge festgelegt durch Benutzer)
|
HUGE_VAL steht für den größtmöglichen Fließkommazahlenwert, den ein Prozessor handhaben kann. MIN_INT ist die kleinste Ganzzahl und MAX_INT ist die größte Ganzzahl.
16.10.2 CMP
CMP
liefert eine Ganzzahl, die eine Sortierung ihrer Argumente repräsentiert.
|
liefert einen Wert kleiner als 0, wenn expr1 kleiner ist als expr2; 0, wenn expr1 gleich expr2 ist und einen Wert größer 0, wenn expr1 größer ist als expr2. Zum Erkennen der Sortierung wird die einfache (ohne Stern) Sortierrelation wie bei den Relationaloperatoren (siehe Relationsoperatoren) verwendet.
Es darf nicht angenommen werden, dass der Rückgabewert immer -1, 0 oder 1 ist!
Beispiel: `(CMP "Bike" "bIKE")' liefert -1.
Siehe auch CMP*, Relationsoperatoren.
16.10.3 CMP*
CMP*
ist die Stern-Version von CMP
.
Der Unterschied ist, dass CMP*
eine erweiterte Sortierung
wie bei den Relationsoperatoren
(siehe Relationsoperatoren)
verwendet, bei denen Zeichenketten zeichengrößenunabhängig und
Datensätze gemäß ihrer benutzerdefinierten Datensatzreihenfolge
verglichen werden.
Beispiel: `(CMP* "Bike" "bIKE")' liefert 0.
Siehe auch CMP, Relationsoperatoren.
16.10.4 MAX
MAX
liefert den Ausdruck mit dem größten Wert.
|
Liefert den größten Wert der Argumente expr .... Werden keine Argumente angegeben, so wird NIL zurückgegeben. Zum Bestimmen des größten Ausdrucks wird die einfache (ohne Stern) Sortierrelation wie bei den Relationaloperatoren (siehe Relationsoperatoren) verwendet.
Siehe auch MAX*, MIN, Relationsoperatoren.
16.10.5 MAX*
MAX*
ist die Stern-Version von MAX
.
Der Unterschied ist, dass MAX*
eine erweiterte Sortierung
wie bei den Relationsoperatoren
(siehe Relationsoperatoren)
verwendet, bei denen Zeichenketten zeichengrößenunabhängig und
Datensätze gemäß ihrer benutzerdefinierten Datensatzreihenfolge
verglichen werden.
Beispiel: `(MAX* "x" "Y")' ergibt "Y".
Siehe auch MAX, MIN*, Relationsoperatoren.
16.10.6 MIN
MIN
liefert den Ausdruck mit dem kleinsten Wert.
|
Liefert den kleinsten Wert der Argumente expr .... Werden keine Argumente angegeben, so wird NIL zurückgegeben. Zum Bestimmen des kleinsten Ausdrucks wird die einfache (ohne Stern) Sortierrelation wie bei den Relationaloperatoren (siehe Relationsoperatoren) verwendet.
Siehe auch MIN*, MAX, Relationsoperatoren.
16.10.7 MIN*
MIN*
ist die Stern-Version von MIN
.
Der Unterschied ist, dass MIN*
eine erweiterte Sortierung
wie bei den Relationsoperatoren
(siehe Relationsoperatoren)
verwendet, bei denen Zeichenketten zeichengrößenunabhängig und
Datensätze gemäß ihrer benutzerdefinierten Datensatzreihenfolge
verglichen werden.
Beispiel: `(MIN* "x" "Y")' ergibt "x".
Siehe auch MIN, MAX*, Relationsoperatoren.
16.11 Mathematik-Funktionen
Einige mathematische Funktionen werden hier aufgelistet.
16.11.1 + | Addieren von Werten. | |
16.11.2 - | Subtrahieren von Werten. | |
16.11.3 1+ | Erhöhen von Werten. | |
16.11.4 1- | Verringern von Werten. | |
16.11.5 * | Fließkomma-Multiplikation. | |
16.11.6 / | Fließkomma-Division. | |
16.11.7 DIV | Ganzzahl-Division. | |
16.11.8 MOD | Ganzzahl-Modulo. | |
16.11.9 ABS | Absoluter Wert eines Ausdrucks. | |
16.11.10 TRUNC | Nachkommastellen einer Fließkommazahl abschneiden. | |
16.11.11 ROUND | Eine Fließkommazahl runden. | |
16.11.12 RANDOM | Zufallszahlengenerator. | |
16.11.13 POW | Potenzfunktion. | |
16.11.14 SQRT | Wurzelfunktion. | |
16.11.15 EXP | Exponentialfunktion. | |
16.11.16 LOG | Logarithmus einer Zahl. |
16.11.1 Werte addieren
Zum Zusammenzählen von Zahlen verwendet man
|
Liefert die Summe der Parameter expr .... Wenn irgendein Parameter NIL ist, dann ist das Ergebnis NIL. Wenn die Werte vom Typ Fließkomma- oder Ganzzahl sind, dann ist das Ergebnis auch eine Fließkommazahl (oder Ganzzahl).
Es lassen sich auch Zeichenketten und mehrzeilige Texte 'addieren'. In diesem Fall ist das Ergebnis die zusammengehängten Zeichenketten bzw mehrzeiligen Texte.
Ist expr vom Typ Datum und der Rest der Parameter sind Ganz-/Fließkommazahlen, dann wird die Summe der Ganz-/Fließkommazahlen als Anzahl Tage aufgefasst und zu expr addiert. Ist das zurückgelieferte Ergebnis außerhalb des gültigen Bereichs (vor dem 1.1.0000 oder nach dem 31.12.9999), dann ist das Ergebnis NIL.
Ist expr vom Typ Zeit und der Rest der Parameter sind Ganz-/Fließkommazahlen oder andere Zeitwerte, dann wird die Summe der Ganz-/Fließkommazahlen (als Anzahl Sekunden aufgefasst) und Zeitwerte zu expr addiert. Ist das zurückgelieferte Ergebnis außerhalb des gültigen Bereichs (kleiner als 00:00:00 oder größer als 596523:14:07),dann ist das Ergebnis NIL.
Beispiele
Ausdruck Wert
(+ 1 2 3) 6
(+ 5 1.0) 6.0
(+ "Hallo" " " "Welt!") "Hallo Welt!"
(+ 28.11.1968 +365 -28 -9) 22.10.1969
(+ 07:30:00 3600) 08:30:00
(+ 03:00:00 23:59:59) 26:59:59
|
Siehe auch -, 1+, *, CONCAT, CONCAT2, ADDMONTH, ADDYEAR.
16.11.2 Werte subtrahieren
Zum Subtrahieren von Werten verwendet man
|
Zieht die Summe expr2 ... von expr1 ab. Hier gelten die gleichen Regeln wie beim Addieren von Werten (siehe Werte addieren außer dass Zeichenketten und mehrzeilige Texte nicht subtrahiert werden können.
(-
expr)
hat eine spezielle Bedeutung: Es liefert den
negativen Wert von expr (Ganz- oder Fließkommazahl), z.B.
`(- (+ 1 2))' liefert -3.
16.11.3 1+
1+
erhöht den Wert einer Ganzzahl, Fließkommazahl, Datum or Zeit um Eins.
|
Liefert den Wert von expr (Ganzzahl, Fließkommazahl, Datum oder Zeit) plus Eins. Wenn expr NIL ist, dann wird NIL geliefert.
16.11.4 1-
1-
verringert den Wert einer Ganzzahl, Fließkommazahl, Datum or Zeit
um Eins.
|
Liefert den Wert von expr (Ganzzahl, Fließkommazahl, Datum oder Zeit) minus Eins. Wenn expr NIL ist, dann wird NIL geliefert.
16.11.5 Werte multiplizieren (*)
Zum Multiplizieren von Ganz-/Fließkommazahlen verwendet man
|
Liefert die Multiplikation der Ganz-/Fließkommazahlen expr .... Wenn alle Parameter Ganzzahlen sind, dann wird eine Ganzzahl geliefert, anderenfalls ist der Wert vom Typ Fließkommazahl.
16.11.6 Werte dividieren
Zum Dividieren von Ganz-/Fließkommazahlen verwendet man
|
Teilt expr1 durch die Multiplikation der restlichen Parameter. Liefert eine Fließkommazahl. Bei einer Division durch 0 wird NIL geliefert.
16.11.7 DIV
DIV
verwendet man zur Ganzzahldivision.
|
Liefert die Ganzzahldivision von int1 mit int2. Zum Beispiel liefert `(DIV 5 3)' den Wert 1.
16.11.8 MOD
MOD
wird zur Modulo-Berechnung verwendet.
|
Liefert int1 modulo int2. Zum Beispiel liefert `(MOD 5 3)' den Wert 2.
Siehe auch DIV.
16.11.9 ABS
ABS
berechnet den absoluten Wert eines Ausdrucks.
|
Liefert den absoluten Wert von expr (Ganz- oder Fließkommazahl). Ist expr NIL, dann wird NIL geliefert.
16.11.10 TRUNC
TRUNC
schneidet die Nachkommastellen einer Zahl ab.
|
Liefert die größte Ganzzahl (als Fließkommazahl), die nicht größer ist als die angegebene Fließkommazahl. Ist real NIL, dann wird NIL geliefert.
Beispiele: `(TRUNC 26.1)' liefert 26, `(TRUNC -1.2)' liefert -2.
Siehe auch ROUND.
16.11.11 ROUND
ROUND
rundet einen Fließkommawert.
|
Liefert den angegebenen Fließkommawert aufgerundet auf digits Stellen. Ist real oder digits gleich NIL, dann wird NIL geliefert.
Beispiele: `(ROUND 70.70859 2)' liefert 70.71, `(ROUND 392.36 -1)' liefert 390.0.
Siehe auch TRUNC.
16.11.12 RANDOM
RANDOM
kann zum Generieren von Zufallszahlen verwendet werden.
|
Liefert eine Zufallszahl. Beim ersten Aufruf wird der Zufallszahlengenerator
mit dem Wert aus der aktuellen Uhrzeit initialisiert. RANDOM
erzeugt
eine Zufallszahl im Bereich von 0 ... expr, ausgenommen expr
selbst. Der Typ von expr (Ganz- oder Fließkommazahl) ist auch der
Rückgabewert-Typ. Ist expr NIL, dann wird NIL geliefert.
Beispiele:
Beispiel Bedeutung
(RANDOM 10) liefert einen Wert von 0 bis 9,
(RANDOM 10.0) liefert einen Wert von 0.0 bis 9.99999...
|
16.11.13 POW
POW
berechnet die Potenz von Zahlen.
|
Liefert den Wert der Fließkommazahl x potenziert mit Fließkommazahl y. Ist x or y NIL, oder ist x negativ und y keine Ganzzahl, so wird NIL zurückgegeben.
Beispiel: `(POW 2 3)' ergibt 8.
16.11.14 SQRT
SQRT
berechnet die Wurzel einer Zahl.
|
Gibt die Quadratwurzel der Fließkommazahl x zurück. Ist x NIL oder ein negativer Wert, so wird NIL zurückgegeben.
Siehe auch POW.
16.11.15 EXP
EXP
berechnet die Exponentialfunktion.
|
Liefert den Wert der Basis des natürlichen Logarithmus potenziert mit Fließkommazahl x. Ist x NIL, so wird NIL zurückgegeben.
16.11.16 LOG
LOG
berechnet den natürlichen Logarithmus einer Zahl.
|
Liefert den natürlichen Logarithmus der Fließkommazahl x. Ist x NIL oder keine positive Zahl, so wird NIL zurückgegeben.
Siehe auch EXP.
16.12 Zeichenkettenfunktionen
Dieser Abschnitt behandelt Funktionen für Zeichenketten.
16.12.1 LEN | Zeichenkettenlänge. | |
16.12.2 LEFTSTR | Linke Teilzeichenkette. | |
16.12.3 RIGHTSTR | Rechte Teilzeichenkette. | |
16.12.4 MIDSTR | Individuelle Teilzeichenkette. | |
16.12.5 SETMIDSTR | Teilzeichenkette setzen. | |
16.12.6 INSMIDSTR | Zeichenkette einfügen. | |
16.12.7 INDEXSTR | erstes Auftreten einer Teilzeichenkette, zeichengrößenabhängig. | |
16.12.8 INDEXSTR* | erstes Auftreten einer Teilzeichenkette, zeichengrößenunabhängig. | |
16.12.9 INDEXBRK | erstes Auftreten eines Zeichens, zeichengrößenabhängig. | |
16.12.10 INDEXBRK* | erstes Auftreten eines Zeichens, zeichengrößenunabhängig. | |
16.12.11 RINDEXSTR | letztes Auftreten einer Teilzeichenkette, zeichengrößenabhängig. | |
16.12.12 RINDEXSTR* | letztes Auftreten einer Teilzeichenkette, zeichengrößenunabhängig. | |
16.12.13 RINDEXBRK | letztes Auftreten eines Zeichens, zeichengrößenabhängig. | |
16.12.14 RINDEXBRK* | letztes Auftreten eines Zeichens, zeichengrößenunabhängig. | |
16.12.15 REPLACESTR | Teilzeichenketten ersetzen, zeichengrößenabhängig. | |
16.12.16 REPLACESTR* | Teilzeichenketten ersetzen, zeichengrößenunabhängig. | |
16.12.17 REMCHARS | Zeichen aus Zeichenkette entfernen. | |
16.12.18 TRIMSTR | Führende und abschließende Zeichen entfernen. | |
16.12.19 WORD | Wort aus Zeichenkette holen. | |
16.12.20 WORDS | Anzahl Wörter in einer Zeichenkette. | |
16.12.21 FIELD | Feld aus Zeichenkette holen. | |
16.12.22 FIELDS | Anzahl Felder in einer Zeichenkette. | |
16.12.23 STRTOLIST | Zeichenkette in Liste von Zeichenketten umwandeln. | |
16.12.24 LISTTOSTR | Liste von Elementen in Zeichenkette umwandeln. | |
16.12.25 CONCAT | Zeichenketten verbinden. | |
16.12.26 CONCAT2 | Zeichenketten verbinden. | |
16.12.27 COPYSTR | Erzeugt Kopien einer Zeichenkette. | |
16.12.28 SHA1SUM | SHA1-Hash einer Zeichenkette. | |
16.12.29 UPPER | Zeichenkette in Großbuchstaben. | |
16.12.30 LOWER | Zeichenkette in Kleinbuchstaben. | |
16.12.31 ASC | Unicode/8-bit-Wert eines Zeichens. | |
16.12.32 CHR | Zeichen eines Unicode/8-bit-Werts. | |
16.12.33 LIKE | Zeichenkettenvergleich. | |
16.12.34 SPRINTF | Zeichenkettenformatierung. |
16.12.1 LEN
LEN
berechnet die Länge der Zeichenkette.
|
Liefert die Länge der gegebenen Zeichenkette oder NIL wenn str NIL ist.
Siehe auch WORDS, LINES, MAXLEN.
16.12.2 LEFTSTR
LEFTSTR
extrahiert eine Teilzeichenkette aus einer Zeichenkette.
|
Liefert den linken Teil einer gegebenen Zeichenkette mit höchstens len Zeichen. Ist str oder len gleich NIL oder ist len negativ, dann wird NIL geliefert.
Beispiel: `(LEFTSTR "Hallo Welt!" 5)' liefert "Hallo".
Siehe auch RIGHTSTR, MIDSTR, WORD, LINE.
16.12.3 RIGHTSTR
RIGHTSTR
extrahiert eine Teilzeichenkette aus einer Zeichenkette.
|
Liefert den rechten Teil einer gegebenen Zeichenkette mit höchstens len Zeichen. Ist str oder len gleich NIL oder ist len negativ, dann wird NIL geliefert.
Beispiel: `(RIGHTSTR "Hallo Welt!" 5)' liefert "Welt!".
Siehe auch LEFTSTR, MIDSTR, WORD, LINE.
16.12.4 MIDSTR
MIDSTR
extrahiert eine Teilzeichenkette aus einer Zeichenkette.
|
Liefert einen Teil einer gegebenen Zeichenkette mit höchstens len Zeichen. Die Teilzeichenkette beginnt an der Stelle pos (beginnend bei Null). Ist len NIL, dann wird die komplette Teilzeichenkette, welche bei pos beginnt, zurückgegeben. Falls str NIL oder len negativ ist, dann wird NIL zurückgeliefert. Ist pos außerhalb des gültigen Bereichs (negativ oder größer als die Zeichenkettenlänge), dann wird NIL geliefert.
Beispiel: `(MIDSTR "Hallo Welt!" 3 5)' liefert "lo We".
Siehe auch LEFTSTR, RIGHTSTR, WORD, LINE, SETMIDSTR, INSMIDSTR.
16.12.5 SETMIDSTR
SETMIDSTR
setzt eine Teilzeichenkette in einer Zeichenkette.
|
Liefert eine Kopie der Zeichenkette str, in dem die Zeichenkette beginnend bei index mit der Zeichenkette set überschrieben wird. Die Länge der zurückgelieferten Zeichenkette ist größer oder gleich der von str. Ist einer der Parameter NIL oder ist index außerhalb des gültigen Bereichs, dann wird NIL geliefert.
Beispiel: `(SETMIDSTR "Hallo Welt!" 6 "Melanie!")' liefert "Hallo Melanie!".
Siehe auch INSMIDSTR, REPLACESTR.
16.12.6 INSMIDSTR
INSMIDSTR
wird verwendet, um eine Teilzeichenkette in eine
Zeichenkette einzufügen.
|
Liefert eine Kopie der Zeichenkette str, in der die Zeichenkette insert an der gegebenen Stelle eingefügt wurde. Ist eines der Parameter NIL oder ist index außerhalb des gültigen Bereichs, dann wird NIL zurückgeliefert.
Beispiel: `(INSMIDSTR "Hallo Welt!" 6 "BeeBase-")' liefert "Hallo BeeBase-Welt!".
Siehe auch SETMIDSTR, REPLACESTR.
16.12.7 INDEXSTR
INDEXSTR
sucht in einer Zeichenkette nach dem ersten Vorkommen der
Teilzeichenkette.
|
Sucht nach dem ersten Vorkommen von substr in str. Der Zeichenkettenvergleich wird mit Beachtung der Groß-/Kleinschreibung durchgeführt. Liefert die Stelle (beginnend bei 0) von der Teilzeichenkette in str oder NIL, wenn die Teilzeichenkette nicht vorhanden ist. Ist eines der Argumente NIL, dann wird NIL zurückgegeben.
Beispiel: `(INDEXSTR "Hallo Welt!" "Welt")' liefert 6.
Siehe auch INDEXSTR*, RINDEXSTR, RINDEXSTR*, INDEXBRK, INDEXBRK*.
16.12.8 INDEXSTR*
INDEXSTR*
hat den selben Effekt als INDEXSTR
(siehe INDEXSTR), außer dass der Zeichenkettenvergleich nicht auf
Groß-/Kleinschreibung achtet.
Siehe auch INDEXSTR, RINDEXSTR, RINDEXSTR*, INDEXBRK, INDEXBRK*.
16.12.9 INDEXBRK
INDEXBRK
sucht nach dem ersten Vorkommen eines Zeichens in einer
Zeichenkette.
|
Sucht nach dem ersten Vorkommen eines Zeichens von brkstr in str. Der Zeichenkettenvergleich wird mit Beachtung der Groß-/Kleinschreibung durchgeführt. Liefert die Stelle (beginnend bei 0) des ersten Zeichens, das in str gefunden wurde, anderenfalls NIL. Ist eines der Parameter NIL, dann wird NIL geliefert.
Beispiel: `(INDEXBRK "Hallo Welt!" "aeiou")' liefert 1.
Siehe auch INDEXBRK*, RINDEXBRK, RINDEXBRK*, INDEXSTR, INDEXSTR*.
16.12.10 INDEXBRK*
INDEXBRK*
hat den selben Effekt wie INDEXBRK
(siehe INDEXBRK), außer dass der Zeichenvergleich nicht auf
Groß-/Kleinschreibung achtet.
Siehe auch INDEXBRK, RINDEXBRK, RINDEXBRK*, INDEXSTR, INDEXSTR*.
16.12.11 RINDEXSTR
RINDEXSTR
sucht in einer Zeichenkette nach dem letzten Vorkommen der
Teilzeichenkette.
|
Sucht nach dem letzten Vorkommen von substr in str. Der Zeichenkettenvergleich wird mit Beachtung der Groß-/Kleinschreibung durchgeführt. Liefert die Stelle (beginnend bei 0) von der Teilzeichenkette in str oder NIL, wenn die Teilzeichenkette nicht vorhanden ist. Ist eines der Argumente NIL, dann wird NIL zurückgegeben.
Beispiel: `(RINDEXSTR "Do itashimashite." "shi")' liefert 11.
Siehe auch RINDEXSTR*, INDEXSTR, INDEXSTR*, RINDEXBRK, RINDEXBRK*.
16.12.12 RINDEXSTR*
RINDEXSTR*
hat den selben Effekt als RINDEXSTR
(siehe RINDEXSTR), außer dass der Zeichenkettenvergleich nicht auf
Groß-/Kleinschreibung achtet.
Siehe auch RINDEXSTR, INDEXSTR, INDEXSTR*, RINDEXBRK, RINDEXBRK*.
16.12.13 RINDEXBRK
RINDEXBRK
sucht nach dem letzten Vorkommen eines Zeichens in einer
Zeichenkette.
|
Sucht nach dem letzten Vorkommen eines Zeichens von brkstr in str. Der Zeichenkettenvergleich wird mit Beachtung der Groß-/Kleinschreibung durchgeführt. Liefert die Stelle (beginnend bei 0) des letzten Zeichens, das in str gefunden wurde, anderenfalls NIL. Ist eines der Parameter NIL, dann wird NIL geliefert.
Beispiel: `(RINDEXBRK "Konnichiwa" "chk")' liefert 6.
Siehe auch RINDEXBRK*, INDEXBRK, INDEXBRK*, RINDEXSTR, RINDEXSTR*.
16.12.14 RINDEXBRK*
RINDEXBRK*
hat den selben Effekt wie RINDEXBRK
(siehe RINDEXBRK), außer dass der Zeichenvergleich nicht auf
Groß-/Kleinschreibung achtet.
Siehe auch RINDEXBRK, INDEXBRK, INDEXBRK*, RINDEXSTR, RINDEXSTR*.
16.12.15 REPLACESTR
REPLACESTR
ersetzt Teilzeichenketten durch andere Zeichenketten.
|
Ersetzt alle Vorkommen von substr1 in str durch replacestr1. Fortführend werden mit der nächsten Such- und Ersetzungszeichenkette weitere Teilzeichenketten in der neu erhaltenen Zeichenkette ersetzt bis alle Argumente abgearbeitet sind. Zu beachten ist, dass die Anzahl der Argumente ungerade sein muss. Arumente an geraden Positionen geben die Such-Teilzeichenketten an, jeweils gefolgt von der Ersetzungszeichenkette. Aufgrund der Tatsache, dass das Ergebnis einer Ersetzung für die darauf folgende Ersetzung verwendet wird, können Mehrfachersetzungen auftreten. Dies sollte bei Verwendung dieser Funktion beachtet werden. Das Ändern der Reihenfolge der Argumente kann helfen, Konflikte aufzulösen, da Ersetzungen immer von links nach rechts durchgeführt werden.
Wenn eine der Zeichenketten NIL ist oder einer der Such-Teilzeichenketten leer ist, dann wird NIL zurückgeliefert.
Beispiel: `(REPLACESTR "black is white" "black" "white" "white "black")' results to "black is black".
Siehe auch REPLACESTR*, SETMIDSTR, INSMIDSTR, REMCHARS.
16.12.16 REPLACESTR*
REPLACESTR*
hat den selben Effekt wie REPLACESTR
(siehe REPLACESTR), außer dass der Zeichenvergleich für die Suche
nach Teilzeichenketten nicht auf Groß-/Kleinschreibung achtet.
Siehe auch REPLACESTR, SETMIDSTR, INSMIDSTR, REMCHARS.
16.12.17 REMCHARS
REMCHARS
entfernt Zeichen aus einer Zeichenkette.
|
Liefert eine Kopie von str, in der alle Zeichen von chars-to-remove entfernt wurden. Ist str oder chars-to-remove NIL, dann wird NIL geliefert.
Beispiel: `(REMCHARS deine-zeichenkette " \t\n")' entfernt alle Leerzeichen, Tabulatoren und Neue-Zeile-Zeichen aus deine-zeichenkette.
Siehe auch REPLACESTR, TRIMSTR.
16.12.18 TRIMSTR
TRIMSTR
entfernt führende und abschließende Zeichen von einer
Zeichenkette.
|
Liefert eine Kopie von str, in der führenden und abschließenden
Zeichen entfernt wurden. Bei Aufruf mit nur einem Argument werden
Leerzeichen, Seiten- und Zeilenumbrüche, Carriage Return, sowie horizontable
unf vertikale Tabulatoren entfernt. Werden drei Argumente verwendet,
so gibt front die führenden und back die abschließenden Zeichen
an, die enfernt werden sollen. TRIMSTR
kann nicht mit zwei Argumenten
aufgerufen werden.
Ist eines der Argumente str, front oder back NIL, so wird NIL zurückgegeben.
Beispiel: (TRIMSTR " Ich fuhr Selma's Fahrrad zu Schrott. ")
liefert
"Ich fuhr Selma's Fahrrad zu Schrott.",
(TRIMSTR "007 " "0" " \f\n\r\t\v")
ergibt "7".
Siehe auch REMCHARS.
16.12.19 WORD
WORD
liefert ein Wort einer Zeichenkette.
|
Liefert das num-te Wort (beginnend bei Null) aus der gegebenen Zeichenkette. Wörter sind nicht-leere Teilzeichenketten, die durch ein oder mehrere nicht-brechbare Leerzeichen (z.B. Leerzeichen, Tabulatoren und Neue-Zeile-Zeichen) getrennt sind.
Ist str oder num gleich NIL oder ist num außerhalb des gültigen Bereichs (negativ oder größer gleich der Anzahl Wörter in der Zeichenkette), dann wird NIL zurückgeliefert.
Beispiel: `(WORD "Deshalb lieh ich Selma mein Fahrrad." 3)' liefert "Selma".
Siehe auch WORDS, FIELD, LINE, LEFTSTR, RIGHTSTR, MIDSTR, STRTOLIST.
16.12.20 WORDS
WORDS
zählt die Anzahl der Wörter in einer Zeichenkette.
|
Liefert die Anzahl der Wörter in der gegebenen Zeichenkette oder NIL, wenn str NIL ist. Wörter sind nicht-leere Teilzeichenketten, die durch ein oder mehrere nicht-brechbare Leerzeichen (z.B. Leerzeichen, Tabulatoren und Neue-Zeile-Zeichen) getrennt sind.
Beispiel: `(WORDS "In Wirklichkeit ist es aber nicht mein Fahrrad.")' liefert 8.
Siehe auch WORD, FIELDS, LINES, LEN.
16.12.21 FIELD
FIELD
liefert ein Feld in einer Zeichenkette.
|
Liefert das num-te Feld (beginnend bei Null) in der gegebenen Zeichenkette. Felder sind Teilzeichenketten, die durch genau ein Trennzeichen getrennt sind. Ein Feld kann eine leere Zeichenkette sein. Argument sep enthält die Trennzeichen, durch die Felder getrennt sind. Ist sep NIL oder wird es nicht angegeben, so werden nicht-brechbare Leerzeichen (z.B. Leerzeichen, Tabulatoren und Neue-Zeile-Zeichen) verwendet. Wird quotes angegeben und ist nicht NIL, so können Felder mit doppelten Anführungszeichen umgeben sein und Trennzeichen enthalten. Die doppelten Anführungszeichen werden entfernt bevor das Feld zurückgegeben wird.
Ist str oder num gleich NIL oder ist num außerhalb des gültigen Bereichs (negativ oder größer gleich der Anzahl Wörter in der Zeichenkette), dann wird NIL zurückgeliefert.
Beispiel: `(FIELD "Mein Name ist \"Darth Vader\"" 3 " " TRUE)' liefert "Darth Vader".
Siehe auch FIELDS, WORD, LEFTSTR, RIGHTSTR, MIDSTR, STRTOLIST.
16.12.22 FIELDS
FIELDS
zählt die Anzahl der Felder in einer Zeichenkette.
|
Liefert die Anzahl Felder in der gegebenen Zeichenkette oder NIL, wenn str NIL ist. Felder sind Teilzeichenketten, die durch genau ein Trennzeichen getrennt sind. Ein Feld kann eine leere Zeichenkette sein. Argument sep enthält die Trennzeichen, durch die Felder getrennt sind. Ist sep NIL oder wird es nicht angegeben, so werden nicht-brechbare Leerzeichen (z.B. Leerzeichen, Tabulatoren und Neue-Zeile-Zeichen) verwendet. Wird quotes angegeben und ist nicht NIL, so können Felder mit doppelten Anführungszeichen umgeben sein und Trennzeichen enthalten.
16.12.23 STRTOLIST
STRTOLIST
wandelt eine Zeichenkette in eine Liste von Zeichenketten um.
|
Erzeugt eine Liste von Zeichenketten, welche durch das Aufteilen der
Zeichenkette str an den Stellen der Trennungs-Sequenz sep entsteht.
Wird sep nicht angegeben, so wird das Tab-Zeichen "\t"
verwendet.
Ist sep die leere Zeichenkette ""
, so wird eine Liste aller
Zeichen der Zeichenkette generiert.
Ist str oder sep NIL, so wird NIL zurückgegeben.
Beispiele
`(STRTOLIST "Ich\tmag\tJapan.")' ergibt ( "Ich" "mag" "Japan." ).
`(STRTOLIST "Name|Straße|Stadt" "|")' ergibt ( "Name" "Straße" "Stadt" ).
`(STRTOLIST "abc" "")' ergibt ( "a" "b" "c" ).
Siehe auch MEMOTOLIST, LISTTOSTR.
16.12.24 LISTTOSTR
LISTTOSTR
wandelt eine Liste von Elementen in eine Zeichenkette um.
|
Wandelt die gegebene Liste von Elementen in eine Zeichenkette um,
indem die Zeichenketten-Repräsentationen jedes Elements getrennt durch
die Sequenz sep aneinandergehängt werden.
Wird sep nicht angegeben, so wird das Tab-Zeichen "\t"
verwendet.
Ist list oder sep NIL, so wird NIL zurückgegeben.
Beispiele
`(LISTTOSTR (LIST "Peter ist" 18 "Jahre alt"))' ergibt "Peter ist\t18\tJahre alt".
`(LISTTOSTR (LIST "Name" "Straße" "Stadt") "|")' ergibt "Name|Straße|Stadt".
Siehe auch LISTTOMEMO, CONCAT, CONCAT2, STRTOLIST.
16.12.25 CONCAT
CONCAT
verbindet Zeichenketten.
|
Liefert die Verknüpfung der gegebenen Liste von Zeichenketten, wobei einzelne Leerzeichenzwischen den Zeichenketten eingefügt werden. Ist eine der Zeichenketten NIL oder die Liste leer, dann wird NIL zurückgeliefert.
Beispiele: `(CONCAT "Ich" "dachte," "es" "war" "ein "verlassenes" "Fahrrad.")' liefert "Ich dachte, es war ein verlassenes Fahrrad.".
Siehe auch CONCAT2, +, LISTTOSTR, COPYSTR, SPRINTF.
16.12.26 CONCAT2
CONCAT2
verbindet Zeichenketten.
|
Liefert die Verknüpfung der gegebenen Liste von Zeichenketten. Zwischen den Zeichenketten wird jeweils die gegebene Zeichenkette insert eingefügt. Ist eine der Zeichenketten NIL oder die Liste leer, dann wird NIL zurückgeliefert.
Beispiel: `(CONCAT2 "! " "Aber" "es" "war es nicht!")' liefert "Aber! es! war es nicht!".
Siehe auch CONCAT, +, LISTTOSTR, COPYSTR, SPRINTF.
16.12.27 COPYSTR
COPYSTR
erzeugt Kopien einer Zeichenkette.
|
Liefert eine Zeichenkette, die num mal die Zeichenkette str enthält. Ist str NIL, num gleich NIL oder kleiner als NUll, dann wird NIL zurückgegeben.
Beispiel: `(COPYSTR "+-" 5)' liefert "+-+-+-+-+-".
Siehe auch CONCAT CONCAT2, +, SPRINTF.
16.12.28 SHA1SUM
SHA1SUM
berechnet den SHA1-Hash einer Zeichenkette.
|
Gibt eine Zeichenkette zurück, welche den SHA1-Hash der gegebenen Zeichenkette enthält. Ist str NIL, so wird NIL zurückgegeben.
Beispiel: `(SHA1SUM "flower, sun and beach")' ergibt "47b6c496493c512b40e042337c128d85ecf15ba4".
Siehe auch ADMINPASSWORD, Beispielprojekt `Users.bbs'.
16.12.29 UPPER
UPPER
wandelt eine Zeichenkette in Großbuchstaben.
|
Liefert eine Kopie der gegebenen Zeichenkette, in der alle Zeichen in Großbuchstaben umgewandelt wurden. Ist str NIL, dann wird NIL geliefert.
Beispiel: `(UPPER "Selma fand einen Brief, der an mein Fahrrad geheftet war.")' liefert "SELMA FAND EINEN BRIEF, DER AN MEIN FAHRRAD GEHEFTET WAR.".
Siehe auch LOWER.
16.12.30 LOWER
LOWER
wandelt eine Zeichenkette in Kleinbuchstaben.
|
Liefert eine Kopie der gegebenen Zeichenkette, in der alle Zeichen zu Kleinbuchstaben umgewandelt wurden. Ist str NIL, dann wird NIL geliefert.
Beispiel: `(LOWER "Der Brief war von Silke.")' liefert "der brief war von silke.".
Siehe auch UPPER.
16.12.31 ASC
ASC
wandelt ein Zeichen in die interne Zahlendarstellung um.
|
Liefert den internen Zahlenwert des ersten Zeichens von str. Auf Windows, Mac OS und Linux ist dies die Unicode-Darstellung. Auf Amiga ist es der 8-bit-Zahlenwert in der vom System vorgegebenen Zeichen-Kodierung. Ist str leer, wird 0 geliefert. Ist str NIL, dann wird NIL geliefert.
Beispiel: (ASC "A")
liefert 65.
16.12.32 CHR
CHR
wandelt einen Zahlenwert in ein Zeichen um.
|
Liefert eine Zeichenkette, die das Zeichen mit dem Zahlen-Code int enthält. Auf Linux und Windows wird int als Unicode-Zeichen interpretiert. Auf Amiga ist int der 8-bit Zahlenwert in der vom System vorgegebenen Zeichenkodierung. Ist int gleich 0, dann wird eine leere Zeichenkette geliefert. Ist int NIL oder nicht im Bereich der zulässigen Zeichenwerte, so wird NIL geliefert.
Beispiel: `(CHR 99)' liefert "c".
16.12.33 LIKE
LIKE
vergleicht Zeichenketten.
|
Liefert TRUE, wenn str1 mit str2 übereinstimmt, anderenfalls NIL. Die Zeichenkette str2 kann die Jokerzeichen '?' und '*' enthalten, wobei '?' genau irgendein einzelnes Zeichen und '*' eine Zeichenkette jeder Länge irgendeines Inhalts (inklusive der leeren Zeichenkette) darstellt. Der Zeichenkettenvergleich wird ohne Beachtung der Groß-/Kleinschreibung durchgeführt.
Beispiel: `(LIKE "Silke war für ein Jahr in Frankreich." "*Jahr*")' liefert TRUE.
Siehe auch Vergleichsfunktionen.
16.12.34 SPRINTF
SPRINTF
formatiert eine Zeichenkette mit verschiedenen Daten.
|
SPRINTF
erhält eine Reihe von Parametern, die in Zeichenketten
umgewandelt werden und in aufbereiteter Form als einzelne Zeichenkette
zurückgegeben wird.
Die Zeichenkette fmt entscheidet genau, was in die zurückgegebene
Zeichenkette geschrieben werden soll und kann zwei Arten von Elemente
enthalten: ordinäre Zeichen, die unverändert kopiert werden und
Umwandlungsbefehle, die SPRINTF
anweisen, die Parameter aus seiner
Parameterliste zu nehmen und zu formatieren.
Umwandlungsbefehle beginnen immer mit dem Zeichen `%'.
Umwandlungsbefehle benötigen immer diese Form:
|
wobei
- Das optionale Feld flags steuert die Ausrichtung der Ausgabe, das
Vorzeichen von numerischen Werten, Dezimalpunkte und führende Leerzeichen.
- Das optionale Feld width legt die minimale Anzahl von Zeichen
fest, die ausgegeben werden sollen (die Feldbreite), gegebenenfalls wird mit
Leerzeichen oder führenden Nullen aufgefüllt.
- Das optionale Feld precision legt entweder die maximale Anzahl
von auszugebenden Zeichen für die Typen Zeichenkette, Boolesch, Datum
und Zeit oder die Anzahl der Ziffern nach dem Dezimalpunkt zur Ausgabe eines
Fließkommawertes fest.
- Das Feld type legt den gewünschten Type des Parameters fest, den
SPRINTF
umwandeln soll, wie etwa Zeichenkette, Ganzzahl, Fliekommazahl etc.
Zu beachten ist, dass alle Felder außer type optional sind. Die folgenden Tabellen listen die gültigen Optionen für diese Felder auf.
Flaggenfeld flags
- -:
- Das Ergebnis ist linksbündig, das rechts mit Leerzeichen aufgefüllt wird.
Normalerweise wird das Feld rechtsbündig ausgerichtet und links mit
Leerzeichen oder `0'en aufgefüllt, wenn kein `-' angegeben wird.
- +:
- Das Ergebnis erhält immer ein Zeichen `-' oder `+' vorangestellt,
wenn es eine numerische Umwandlung ist.
- 0:
- Für Zahlen wird linksbündig mit führenden Nullen anstatt
mit Leerzeichen aufgefüllt.
- Leerzeichen:
- Positive Zahlen erhalten ein Leerzeichen anstatt dem Zeichen `+', aber negative Zahlen bekommen nach wie vor das Zeichen `-' vorangestellt.
Breitenfeld width
- n:
- Mindestens n Zeichen werden ausgegeben.
Hat die Umwandlung weniger als n Zeichen ergeben, dann wird mit
Leerzeichen oder führenden Nullen aufgefüllt.
- *:
- Der Breite-Parameter wird in der Parameterliste als Ganz- oder Fließkommazahl vor dem eigentlichen Umwandlungsparameter mitgeliefert. Der Wert ist beschränkt auf 0 bis 999.
Genaugkeitsfeld precision
- .n:
- Für Zeichenketten-, Boolesche, Datums- und Zeit-Werte ist n die
maximale Anzahl der auszugebenden Zeichen vom umgewandelten Element.
Für Umwandlungen von Fließkommazahlen legt n die Anzahl der
Nachkommastellen fest (Umwandlungen `e' und `f') oder die
Anzahl signifikanter Stellen (Umwandlung `g').
Für Ganzzahlkonvertierungen wird dieser Wert ignoriert.
- .*:
- Die Genauigkeit wird in der Parameterliste als Ganz- oder Fließkommazahl vor dem eigentlichen Umwandlungsparameter mitgeliefert. Der Wert ist beschränkt auf 0 bis 999.
Typenfeld type
- b:
- Wandelt einen Booleschen Parameter nach "TRUE" (wahr) oder "NIL" (falsch).
- i:
- Wandelt eine Ganzzahl in Dezimalzahlnotation um.
- o:
- Wandelt eine Ganzzahl in Octalzahlnotation um.
- x:
- Wandelt eine Ganzzahl in Hexadezimalzahlnotation um. Es werden Kleinbuchstaben `abcdef' verwendet.
- X:
- Wandelt eine Ganzzahl in Hexadezimalzahlnotation um. Es werden Großbuchstaben `ABCDEF' verwendet.
- e:
- Wandelt eine Fließkommazahl in das Format `[-]d.ddde+dd' um. Genau eine Ziffer erscheint vor dem Dezimalpunkt, gefolgt von Nachkommastellen, einem `e' und dem Exponenten. Die Anzahl der Nachkommastellen wird im Genauigkeitsfeld festgelegt oder wenn nicht, dann ist sie 2. Der Dezimalpunkt erscheint nicht, wenn sie 0 ist.
- f:
- Wandelt eine Fließkommazahl in das Format `[-]ddd.ddd' um. Die Anzahl der Nachkommastellen wird im Genauigkeitsfeld festgelegt oder wenn nicht, dann ist sie 2. Der Dezimalpunkt erscheint nicht, wenn sie 0 ist.
- g:
- Wandelt eine Fließkommazahl entweder mittels Stil `e' oder `f' um, je nach Anzahl der benötigten Stellen, um die Zahl darzustellen. Ist die Genauigkeit nicht festgelegt, so werden 15 signifikante Stellen verwendet. Nachfolgende Nullen mit der Ausnahme einer einzelnen Null nach dem Dezmialpunkt werden unterdrückt.
- s:
- Schreibt eine Zeichenkette bis zum Ende der Zeichenkette oder soviele Zeichen, wie im Präzisionsfeld angegeben.
- d:
- Wandelt einen Datumswert um.
- t:
- Wandelt einen Zeitwert um.
- %:
- Nur das Zeichen `%' wird geschrieben und kein Parameter umgewandelt.
SPRINTF
liefert die formatierte Zeichenkette oder NIL, wenn fmt
NIL ist.
Beispiele
Aufruf Ergebnis
(SPRINTF "Hallo") "Hallo"
(SPRINTF "%s" "Hallo") "Hallo"
(SPRINTF "%10s" "Hallo") " Hallo"
(SPRINTF "%-10.10s" "Hallo") "Hallo "
(SPRINTF "%010.3s" "Hallo") " Hal"
(SPRINTF "%-5.3b" TRUE) "TRU "
(SPRINTF "%i" 3) "3"
(SPRINTF "%03i" 3) "003"
(SPRINTF "%0- 5.3i" 3) " 3 "
(SPRINTF "%f" 12) "12.00"
(SPRINTF "%10e" 12.0) " 1.20e+01"
(SPRINTF "%+-10.4f" 12.0) "+12.0000 "
(SPRINTF "%10.5t" 12:30:00) " 12:30"
(SPRINTF "%d" 28.11.1968) "28.11.1968"
(SPRINTF "Ha%s %4.4s!"
"llo"
"Weltmeisterschaft") "Hallo Welt!"
|
Siehe auch PRINTF, FPRINTF, STR, +, CONCAT, CONCAT2, COPYSTR.
16.13 Funktionen für mehrzeilige Texte
Dieser Abschnitt behandelt Funktionen für mehrzeilige Texte.
16.13.1 LINE | Eine Zeile aus einem mehrzeiligen Text holen. | |
16.13.2 LINES | Die Anzahl der Zeilen im mehrzeiligen Text. | |
16.13.3 MEMOTOLIST | Einen mehrzeiligen Text in eine Liste umwandeln. | |
16.13.4 LISTTOMEMO | Eine Liste in einen mehrzeiligen Text umwandeln. | |
16.13.5 FILLMEMO | Einen mehrzeiligen Text füllen. | |
16.13.6 FORMATMEMO | Einen mehrzeiligen Text formatieren. | |
16.13.7 INDENTMEMO | Einen mehrzeiligen Text einrücken. |
16.13.1 LINE
LINE
holt eine Zeile aus einem mehrzeiligen Text.
|
Liefert die num-te Zeile (beginnend bei Null) aus dem gegebenen mehrzeiligen Text. Die Zeile hat dann kein abschließendes Neue-Zeile-Zeichen.
Ist str oder num gleich NIL oder ist num außerhalb des gültigen Bereichs (negativ oder größer als Anzahl Zeilen), dann wird NIL zurückgeliefert.
16.13.2 LINES
LINES
liefert die Anzahl der Zeilen in einem mehrzeiligen Text.
|
Liefert die Anzahl der Zeilen des gegebenen mehrzeiligen Textes oder NIL, wenn memo NIL ist.
16.13.3 MEMOTOLIST
MEMOTOLIST
wandelt einen mehrzeiligen Text in eine Liste von
Zeichenketten um.
|
Wandelt den gegebenen mehrzeiligen Text in eine Liste um. Ist memo gleich NIL, dann wird NIL geliefert, anderenfalls wird eine Liste erzeugt, in der jedes Element eine Zeile des mehrzeiligen Textes enthält.
Wird expandstr angegeben und ist nicht NIL, so wird die resultierende
Liste von Zeichenketten weiter unterteilt, indem die Funktion STRTOLIST
auf jedes Listenelement angewendet wird.
Dies ergibt eine Liste von Listen von Zeichenketten.
Beispiele
`(MEMOTOLIST "Meine Versicherung\nzahlt für\ndas kaputte Fahrrad.")' liefert ( "Meine Versicherung" "zahlt für" "das kaputte Fahrrad." ).
`(MEMOTOLIST "Hier ist\tein mehr-spaltiges\nBeispiel." TRUE)' liefert ( ( "Hier ist" "ein mehr-spaltiges" ) ( "Beispiel" ) ).
Siehe auch STRTOLIST, LISTTOMEMO.
16.13.4 LISTTOMEMO
LISTTOMEMO
wandelt eine Liste in einen mehrzeiligen Text um.
|
Wandelt eine gegebene Liste in einen mehrzeiligen Text um. Ist list gleich
NIL, dann wird NIL zurückgegeben, anderenfalls wird ein mehrzeiliget Text
erzeugt, dessen einzelne Zeilen die Zeichenkettendarstellung des
entsprechenden Listenelements enthalten.
Falls ein Listenelement eine Unterliste enthält, so wird
LISTTOSTR
(siehe LISTTOSTR) auf die Unterliste angewandt
bevor die resultierende Zeichenkette in den mehrzeiligen Text aufgenommen wird.
Beispiele
`(LISTTOMEMO (LIST "Silke" "leiht mir" "'mein' Fahrrad" "bis zum" 01.09.1998)' liefert: "Silke\nleiht mir\n'mein' Fahrrad\nbis zum\n01.09.1998".
`(LISTTOMEMO (LIST (LIST "Name" "Geburtstag") (LIST "Steffen" 28.11.1968)' liefert: "Name\tGeburtstag\nSteffen\t28.11.1968".
Siehe auch LISTTOSTR, MEMOTOLIST.
16.13.5 FILLMEMO
FILLMEMO
füllt einen mehrzeiligen Text mit den Ergebnissen von
Ausdrücken.
|
Erzeugt eine Kopie des gegebenen mehrzeiligen Textes, in dem alle Teilzeichenketten der Form `$(expr)' durch ihre Ergebnisse nach der Auswertung ersetzt werden.
Beispiel: `(FILLMEMO "(+ 1 1) ist $(+ 1 1).")' liefert "(+ 1 1) ist 2."
Man sollte nur kleine Ausdrücke in einem mehrzeiligen Text verwenden, da die Fehlersuche nicht einfach ist(3).
Siehe auch FORMATMEMO, INDENTMEMO.
16.13.6 FORMATMEMO
FORMATMEMO
formatiert einen mehrzeiligen Text.
|
Formatiert memo in einen mehrzeiligen Text mit Zeilen, die nicht länger als width Zeichen sind. Wird fill angegeben und ist nicht NIL, dann werden Leerzeichen zum Auffüllen der Zeilen verwendet, damit die Zeilen genau die Länge width erhalten. Der mehrzeilige Test wird abschnittsweise abgearbeitet. Ein Abschnitt beginnt beim ersten Zeichen, das kein Leerzeichen ist. Wird singlelinesec angegeben und ist nicht NIL, dann gehören alle Zeichen in dieser Zeile zu dem Abschnitt. Andernfalls zählen alle Zeichen in dieser und den folgenen Zeilen zu dem Abschnitt, bis eine Zeile gefunden wird, die mit einem Leerzeichen beginnt. Der gesamte Abschnitt wird wortweise formatiert, dies bedeutet, dass soviele Wörter in eine Zeile gesetzt werden, wie dafür vorhanden Platz ist. Die restlichen Wörter kommen dann in eine neue Zeile, usw.
Siehe auch FILLMEMO, INDENTMEMO.
16.13.7 INDENTMEMO
INDENTMEMO
rückt einen mehrzeiligen Text ein, in dem links Leerzeichen
eingefügt werden.
|
Liefert eine Kopie des gegebenen mehrzeiligen Textes, in dem jede Zeile mit indent Leerzeichen eingerückt wird. Ist memo oder indent NIL, dann wird NIL zurückgeliefert. Ist indent negativ, dann wird 0 angenommen.
Siehe auch FILLMEMO, FORMATMEMO.
16.14 Datum- und Zeitfunktionen
Dieser Abschnitt behandelt Funktionen für Datum und Zeit.
16.14.1 DAY | Extraktion des Tags eines Datums. | |
16.14.2 MONTH | Extraktion des Monats eines Datums. | |
16.14.3 YEAR | Extraktion des Jahres eines Datums. | |
16.14.4 DATEDMY | Erstellen eines Datums aus Tag, Monat und Jahr. | |
16.14.5 MONTHDAYS | Anzahl Tage eines Monats. | |
16.14.6 YEARDAYS | Anzahl Tage eines Jahres. | |
16.14.7 ADDMONTH | Addition einer Anzahl Monate zu einem Datum. | |
16.14.8 ADDYEAR | Addition einer Anzahl Jahre zu einem Datum. | |
16.14.9 TODAY | Heutiges Datum. | |
16.14.10 NOW | Aktuelle Uhrzeit. |
16.14.1 DAY
DAY
extrahiert den Tag eines Datums.
|
Liefert eine Ganzahl, welche den Tag des gegebenen Datums repräsentiert. Ist date NIL, so wird NIL zurückgegeben.
Siehe auch MONTH, YEAR, DATEDMY.
16.14.2 MONTH
MONTH
extrahiert den Monat eines Datums.
|
Liefert eine Ganzahl, welche den Monat des gegebenen Datums repräsentiert. Ist date NIL, so wird NIL zurückgegeben.
Siehe auch DAY, YEAR, DATEDMY, MONTHDAYS.
16.14.3 YEAR
YEAR
extrahiert das Jahr eines Datums.
|
Liefert eine Ganzahl, welche das Jahr des gegebenen Datums repräsentiert. Ist date NIL, so wird NIL zurückgegeben.
Siehe auch DAY, MONTH, DATEDMY, YEARDAYS.
16.14.4 DATEDMY
DATEDMY
erstellt ein Datum aus Tag, Monat und Jahr.
|
Erstellt ein Datum aus dem gegebenen Tag, Monat und Jahr. Ist eines von day, month, oder year NIL oder außerhalb des gültigen Bereichs, oder ist das resultierende Datum ungültig, so wird NIL geliefert.
Beispiel: `(DATEDMY 28 11 1968)' ergibt den 28. November, 1968.
Siehe auch DATE, TODAY, DAY, MONTH, YEAR.
16.14.5 MONTHDAYS
MONTHDAYS
bestimmt die Anzahl Tage eines Monats.
|
Liefert die Anzahl Tage des gegebenen Monats und Jahrs als Ganzzahlwert. Ist month NIL oder außerhalb des gültigen Bereichs (kleiner als 1 oder größer als 12), so wird NIL zurückgegeben. Ist year NIL, so wird ein Nicht-Schaltjahr für die Berechnung der Anzahl Tage betrachtet. Falls year ungültig ist (kleiner als 0 oder größer als 9999), so wird NIL geliefert.
Beispiele: `(MONTHDAYS 2 2004)' liefert 29, `(MONTHDAYS 2 NIL)' ergibt 28.
16.14.6 YEARDAYS
YEARDAYS
bestimmt die Anzahl Tage eines Jahres.
|
Liefert die Anzahl Tage des gegebenen Jahrs als Ganzzahlwert. Ist year NIL oder außerhalb des gültigen Bereichs (kleiner als 0 oder größer als 9999), so wird NIL zurückgegeben.
Beispiele: `(YEARDAYS 2004)' liefert 366, `(YEARDAYS 2005)' ergibt 365.
16.14.7 ADDMONTH
ADDMONTH
addiert eine Anzahl Monate zu einem Datum.
|
Liefert ein Datum, bei welchem die gegebene Anzahl Monate zu dem gegebenen Datum addiert wurde. Negative Werte für months subtrahieren Monate. Falls date oder months NIL sind, oder das resultierende Datum ungültig ist, so wird NIL geliefert.
ADDMONTH
behandelt einen Über- oder Unterlauf des Monatfelds,
indem das Jahresfeld entsprechend angepasst wird. Falls das
Tagfeld die maximale Anzahl Tage des resultierenden Monats überschreitet,
so wird es auf den maximal erlaubten Tag reduziert.
Beispiele: `(ADDMONTH 30.01.2004 1)' ergibt 29.02.2004, `(ADDMONTH 30.01.2004 -1)' ergibt 30.12.2003.
16.14.8 ADDYEAR
ADDYEAR
addiert eine Anzahl Jahre zu einem Datum.
|
Liefert ein Datum, bei welchem die gegebene Anzahl Jahre zu dem gegebenen Datum addiert wurde. Negative Werte für years subtrahieren Jahre. Falls date oder years NIL sind, oder das resultierende Datum ungültig ist, so wird NIL geliefert.
ADDYEAR
dekrementiert das Tagfeld um 1, falls date
den 29. Februar repräsentiert und das resultierende Jahr kein Schaltjahr ist.
Beispiele: `(ADDYEAR 29.02.2004 1)' ergibt 28.02.2005, `(ADDMONTH 04.02.2004 -1962)' ergibt 04.02.0042.
16.14.9 TODAY
TODAY
liefert das heutige Datum.
|
Liefert das heutige Datum als Datumswert.
Siehe auch NOW.
16.14.10 NOW
NOW
liefert die aktuelle Uhrzeit.
|
Liefert die aktuelle Uhrzeit als Zeitwert.
Siehe auch TODAY.
16.15 Listenfunktionen
Dieser Abschnitt listet Funktionen zum Verarbeiten von Listen auf.
16.15.1 CONS | Elementarer Listenkonstruktor. | |
16.15.2 LIST | Erzeugt Liste aus Elementen. | |
16.15.3 LENGTH | Liefert Anzahl Elemente einer Liste. | |
16.15.4 FIRST | Holt das erste Element aus einer Liste. | |
16.15.5 REST | Liefert den Rest einer Liste. | |
16.15.6 LAST | Holt das letzte Element aus einer Liste. | |
16.15.7 NTH | Holt das n-te Element aus einer Liste. | |
16.15.8 REPLACENTH | Ersetzt das n-te Element in einer Liste. | |
16.15.9 REPLACENTH* | Ersetzt das n-te Element in einer Liste. | |
16.15.10 MOVENTH | Schiebt das n-te Element in einer Liste an eine neue Position. | |
16.15.11 MOVENTH* | Schiebt das n-te Element in einer Liste an eine neue Position. | |
16.15.12 REMOVENTH | Entfernt das n-te Element in einer Liste. | |
16.15.13 REMOVENTH* | Entfernt das n-te Element in einer Liste. | |
16.15.14 APPEND | Verbindet Listen. | |
16.15.15 REVERSE | Kehrt die Elementreihenfolge einer Liste um. | |
16.15.16 MAPFIRST | Anwenden einer Funktion auf alle Listenelemente. | |
16.15.17 SORTLIST | Sortiert die Elemente einer Liste. | |
16.15.18 SORTLISTGT | Sortiert die Elemente einer Liste. |
16.15.1 CONS
CONS
erzeugt ein Paar von Ausdrücken.
|
Erzeugt eine neue Liste. Das erste Element der neuen Liste ist elem, der Rest sind die Elemente von list (die eine Liste sein muss oder NIL). Die Liste list wird nicht kopiert, sondern nur ein Zeiger auf diese wird verwendet.
Beispiel: `(CONS 1 (CONS 2 NIL))' liefert ( 1 2 ).
Die Elemente der Liste können von jedem Typ sein, z.B. ist es auch möglich,
eine Liste von Listen zu haben (z.B. siehe SELECT).
Der Konstruktor CONS
kann auch verwendet werden, um Element-Paare zu
erzeugen, z.B. `(CONS 1 2)' ist ein Paar mit den Ganzzahlen 1 und 2.
16.15.2 LIST
LIST
erzeugt eine Liste anhand ihrer Parameter.
|
nimmt die Parameter elem ... und generiert daraus eine Liste.
Dies ist gleichbedeutend dem Aufruf von (CONS
elem (CONS
... NIL))
.
Man beachte, dass NIL alleine für eine leere Liste steht.
16.15.3 LENGTH
LENGTH
ermittelt die Länge einer Liste.
|
liefert die Länge der gegebenen Liste.
Beispiel: `(LENGTH (LIST "a" 2 42 3))' liefert 4.
Siehe auch LIST.
16.15.4 FIRST
FIRST
holt das erste Element aus einer Liste.
|
liefert das erste Element der gegebenen Liste. Ist list leer (NIL), dann wird NIL geliefert.
Siehe auch REST, LAST, NTH, CONS.
16.15.5 REST
REST
liefert die Teilliste nach dem ersten Element einer Liste.
|
liefert den Rest der gegebenen Liste (die Liste ohne dem ersten Element). Ist list leer (NIL), dann wird NIL zurückgeliefert.
Beispiel: `(REST (LIST 1 2 3))' liefert ( 2 3 ).
16.15.6 LAST
LAST
holt das letzte Element aus einer Liste.
|
Liefert das letzte Element der gegebenen Liste oder NIL, wenn list NIL ist.
16.15.7 NTH
NTH
holt das n-te Element aus einer Liste.
|
Liefert das n-te Element der gegebenen Liste (beginnend bei 0) oder NIL, wenn das Element nicht existiert.
Siehe auch FIRST, LAST, REPLACENTH
16.15.8 REPLACENTH
REPLACENTH
ersetzt das n-te Element in einer Liste.
|
Liefert eine neue Liste, in der das n-te Element der gegebenen Liste (beginnend bei 0) durch elem ersetzt wurde.
Ist n NIL oder exisistiert das n-te Element nicht, dann wird NIL zurückgegeben.
Siehe auch NTH, REPLACENTH*, MOVENTH, REMOVENTH.
16.15.9 REPLACENTH*
REPLACENTH*
ist die Stern-Variante von REPLACENTH
.
Der einzige Unterschied zu REPLACENTH
ist, dass REPLACENTH*
die Originalliste zurückgibt, falls das n-te Element nicht existiert.
REPLACENTH*
kann wie folgt implementiert werden:
(DEFUN REPLACENTH* (n e l) (LET ((r (REPLACENTH n e l))) (IF r r l) ) ) |
Siehe auch NTH, REPLACENTH, Beispielprojekt `FileList.bbs'.
16.15.10 MOVENTH
MOVENTH
schiebt das n-te Element in einer Liste an eine neue Position.
|
Liefert eine neue Liste, in der das n-te Element der gegebenen Liste (beginnend bei 0) an die m-te Position verschoben wurde.
Ist n oder m NIL oder exisistiert das n-te oder m-te Element nicht, dann wird NIL zurückgegeben.
Beispiel: `(MOVENTH 0 1 (list 1 2 3))' liefert ( 2 1 3 ).
Siehe auch NTH, MOVENTH*, REPLACENTH, REMOVENTH.
16.15.11 MOVENTH*
MOVENTH*
ist die Stern-Variante von MOVENTH
.
Der einzige Unterschied zu MOVENTH
ist, dass MOVENTH*
die Originalliste zurückgibt, falls das n-te oder m-te Element
nicht existiert.
MOVENTH*
kann wie folgt implementiert werden:
(DEFUN MOVENTH* (n m l) (LET ((r (MOVENTH n m l))) (IF r r l) ) ) |
Siehe auch NTH, MOVENTH, Beispielprojekt `FileList.bbs'.
16.15.12 REMOVENTH
REMOVENTH
entfernt das n-te Element in einer Liste.
|
Liefert eine neue Liste, in der das n-te Element der gegebenen Liste (beginnend bei 0) entfernt wurde.
Ist n NIL oder exisistiert das n-te Element nicht, dann wird NIL zurückgegeben.
Beispiel: `(REMOVENTH 1 (list 1 2 3))' liefert ( 1 3 ).
Siehe auch NTH, REMOVENTH*, REPLACENTH, MOVENTH.
16.15.13 REMOVENTH*
MOVENTH*
ist die Stern-Variante von REMOVENTH
.
Der einzige Unterschied zu REMOVENTH
ist, dass REMOVENTH*
die Originalliste zurückgibt, falls das n-te Element nicht existiert.
REMOVENTH*
kann wie folgt implementiert werden:
(DEFUN REMOVENTH* (n l) (LET ((r (REMOVENTH n l))) (IF r r l) ) ) |
Siehe auch NTH, REMOVENTH, Beispielprojekt `FileList.bbs'.
16.15.14 APPEND
APPEND
verbindet Listen.
|
liefert die Verknüpfung von list ....
Beispiel: `(APPEND (list 1 2) (list 3 4) (list 5))' liefert ( 1 2 3 4 5 ).
Siehe auch LIST.
16.15.15 REVERSE
REVERSE
kehrt eine Liste um.
|
liefert die umgekehrte Liste.
Beispiel: `(REVERSE (list 1 2 3))' liefert ( 3 2 1 ).
16.15.16 MAPFIRST
MAPFIRST
wendet eine Funktion auf alle Listenelemente an.
|
Erzeugt eine Liste, deren Elemente das Ergebnis einer angegebenen Funktion sind, die als Parameter die einzelnen Listenelemente der Reihe nach bekommen hat. Die Länge der zurückgelieferten Liste ist genau so lang, wie die längste angegebene Liste. Ist eine der gegebenen Listen zu kurz, dann wird die Liste mit NIL aufgefüllt.
Beispiele
Ausdruck Wert
(MAPFIRST 1+ (LIST 1 2 3)) ( 2 3 4 )
(MAPFIRST + (LIST 1 2 3) (LIST 2 3)) ( 3 5 NIL )
|
16.15.17 SORTLIST
SORTLIST
sortiert die Elemente einer Liste.
|
Liefert eine Kopie der gegebenen Liste, die mit der Funktion func sortiert wurde. Die Sortierfunktion muss zwei Parameter für jedes Element verarbeiten und einen Ganzzahlwert liefern, der kleiner als Null ist, wenn das erste Element 'kleiner' ist als das zweite, einen Wert größer Null, wenn das zweite 'größer' ist als das erste und einen Wert gleich Null, wenn beide Elemente 'gleich' sind.
Beispiel für eine Zeichenkettenvergleichsfunktion für die Sortierung:
(DEFUN cmp_str (x y) (COND ((< x y) -1) ((> x y) 1) (TRUE 0) ) ) |
Nun lässt sich eine Liste durch den Aufruf
(SORTLIST cmp_str (LIST "hi" "gut" "großartig" "ok")) |
sortieren, die ( "großartig" "gut" "hi" "ok" ) liefert.
Siehe auch SORTLISTGT, MAPFIRST.
16.15.18 SORTLISTGT
SORTLIST
sortiert die Elemente einer Liste.
|
Arbeitet wie SORTLIST
, aber hier wird eine Sortierfunktion angegeben,
die einen Wert ungleich NIL liefert, wenn das erste Element 'größer' ist als
das zweite, anderenfalls NIL.
Beispiel: `(SORTLISTGT > (LIST "hi" "gut" "großartig" "ok"))' liefert ( "großartig" "gut" "hi" "ok" ).
Siehe auch SORTLIST, MAPFIRST.
16.16 Benutzereingabefunktionen
Zum Abfragen von Benutzereingaben können folgende Funktionen verwendet werden:
16.16.1 ASKFILE | Abfragen eines Dateinamens. | |
16.16.2 ASKDIR | Abfragen eines Verzeichnisnamens. | |
16.16.3 ASKSTR | Abfragen einer Zeichenkette. | |
16.16.4 ASKINT | Abfragen einer Ganzzahl. | |
16.16.5 ASKCHOICE | Abfragen eines Elements aus vielen. | |
16.16.6 ASKCHOICESTR | Abfragen einer Zeichenkette und bietet vorgegebene an. | |
16.16.7 ASKOPTIONS | Abfragen mehrere Elemente aus vielen. | |
16.16.8 ASKBUTTON | Auswahl eines Knopfdrucks. | |
16.16.9 ASKMULTI | Abfragen mehrere Informationen. |
16.16.1 ASKFILE
ASKFILE
fragt den Benutzer nach einem Dateinamen.
|
Öffnet ein Dateiauswahlfenster zur Eingabe eines Dateinamens. Der Fenstertitel kann in title, der Text des `Ok'-Knopfes in oktext und der vorgegebene Dateiname in default gesetzt werden. Für jeden dieser Argumente kann NIL gesetzt werden, um Vorgabewerte zu verwenden. Der letzte Parameter savemode (Boolesch) setzt das Dateiauswahlfenster in den Speichermodus. Dieser Modus sollte verwendet werden, wenn nach einem Dateinamen gefragt wird, im etwas in eine Datei zu schreiben.
ASKFILE
liefert den eingegebenen Dateinamen als Zeichenkette oder NIL,
wenn der Benutzer das Fenster mit Abbrechen verlassen hat.
16.16.2 ASKDIR
ASKDIR
fragt den Benutzer nach einem Verzeichnisnamen.
|
Öffnet ein Dateiauswahlfenster zur Eingabe eines Verzeichnisnamens.
Die Parameter werden auf die gleiche Weise verwendet
wie in ASKFILE
(siehe ASKFILE).
ASKDIR
liefert den eingegebenen Verzeichnisnamen als Zeichenkette oder
NIL, wenn der Benutzer das Fenster mit Abbrechen verlassen hat.
16.16.3 ASKSTR
ASKSTR
fragt den Benutzer nach einer Zeichenkette.
|
Öffnet ein Fenster, das nach einer Zeichenketteneingabe fragt. Der Fenstertitel, der Text des `Ok'-Knopfes und der Vorgabewert können mit title, oktext beziehungsweise default (mit Zeichenketten oder NIL für die Vorgabewerte) gesetzt werden. maxlen bestimmt die maximale Anzahl Zeichen, die der Benutzer eingeben kann. Wird secret angegeben und ist nicht NIL, so wird die eingegebene Zeichnkette unsichtbar gemacht, indem ein Aufzählungszeichen für jedes Zeichen der Zeichenkette angezeigt wird.
ASKSTR
liefert die eingegebene Zeichenkette oder NIL, wenn der
Benutzer das Fenster mit Abbrechen verlassen hat.
Siehe auch ASKFILE, ASKDIR, ASKCHOICESTR, ASKINT.
16.16.4 ASKINT
ASKINT
fragt den Benutzer nach einer Ganzzahl.
|
Öffnet ein Eingabefenster, das nach einer Ganzzahleingabe fragt. Der Fenstertitel und der Text des `Ok'-Knopfes können mit title und oktext (mit Zeichenketten oder NIL für Vorgabewerte) gesetzt werden. In default wird der Vorgabewert übergeben oder NIL, wenn mit einem leeren Feld begonnen werden soll. In min und max wird der erlaubte Zahlenbereich festgelegt. Eingegebene Werte außerhalb dieses Bereichs werden vom Eingabefenster nicht akzeptiert. Man verwende NIL für einen unbeschränkten Vorgabebereich.
ASKINT
liefert die eingegebene Ganzzahl oder NIL, wenn der Benutzer
das Fenster mit Abbrechen verlassen hat.
Siehe auch ASKSTR.
16.16.5 ASKCHOICE
ASKCHOICE
fragt den Benutzer nach einer Auswahl aus mehreren Elementen.
|
Öffnet ein Eingabefenster, das den Benutzer nach einem Element aus einer Liste von Elementen fragt. Der Fenstertitel und der Text des `Ok'-Knopfes können mit title und oktext (Zeichenketten oder NIL für Vorgabewerte) gesetzt werden. In choices wird eine Liste der Auswahlelemente angegeben. Es kann ein mehr-spaltiges Format verwendet werden, indem jedes Auswahlelement als eine Liste von Unterelementen angegeben wird. Eine Vorauswahl kann in default als Index in die Liste der Auswahlelemente (beginnend mit 0 für das erste Element) getroffen werden. Für keine Vorauswahl wird hier NIL angegeben. Wird das optionale Argument titles angegeben und ist nicht NIL, so wird ein Listenkopf mit dem Inhalt von titles angezeigt. Für ein mehr-spaltiges Format kann titles als eine Liste von Spaltenüberschriften angegeben werden.
Sowohl choices als auch titles können durch einen mehrzeiligen Text
und eine Zeichenkette (anstatt von Listen) angegeben werden.
In diesem Fall werden diese automatisch durch Aufrufen von
(MEMOTOLIST choices TRUE)
(siehe MEMOTOLIST), bzw.
(STRTOLIST titles)
(siehe STRTOLIST) in Listen umgewandelt.
ASKCHOICE
liefert den Index des gewählten Elements oder NIL, wenn der
Benutzer das Fenster mit Abbrechen verlassen hat.
Beispiele
(LET ((items (LIST "Erster Eintrag" 2 3.14 "Letzter Eintrag")) index) (SETQ index (ASKCHOICE "Wähle ein Element" "Ok" items NIL)) (IF index (PRINTF "Benutzer wählte Element Nummer %i mit dem Inhalt <%s>\n" index (STR (NTH index items)) ) ) ) |
Nehmen wir an, Sie wollen den Benutzer einen bestimmten Datensatz
einer Tabelle auswählen lassen.
Die Tabelle soll `Artikel' heißen und die Felder
`Name', `Nummer', and `Preis' enthalten.
Das folgende Programm-Fragment zeigt, wie ASKCHOICE
dazu verwendet werden kann,
um einen Datensatz mit Preis größer 10 und nach Name geordnet auszuwählen:
(LET ((query (SELECT Artikel, Name, Nummer, Preis from Artikel WHERE (> Preis 10) ORDER BY Name)) (recs (MAPFIRST FIRST (REST query))) ; Datensatz-Zeiger (items (MAPFIRST REST (REST query))) ; Auswahl (titles (REST (FIRST query))) ; Überschriften (index (ASKCHOICE "Auswahl" "Ok" items NIL titles)) (rec (NTH index recs))) ; jetzt enthält rec den ausgewählten Datensatz (oder NIL bei Abbruch) ) |
Siehe auch ASKCHOICESTR, ASKOPTIONS.
16.16.6 ASKCHOICESTR
ASKCHOICESTR
fragt den Benutzer nach einer Zeichenkette und bietet
vorgegebene an.
|
Öffnet ein Eingabefenster, das dem Benutzer erlaubt, eine Zeichenkette aus mehreren auszuwählen oder eine beliebige Zeichenkette im separaten Zeichenkettenfeld einzugeben. Der Fenstertitel und der Text des `Ok'-Knopfes können mit title und oktext (Zeichenketten oder NIL für Vorgabewerte) gesetzt werden. In strings wird eine Liste der Auswahlelemente angegeben. Es kann ein mehr-spaltiges Format verwendet werden, indem jedes Auswahlelement als eine Liste von Unterelementen angegeben wird. Der Vorgabewert des Zeichenkettenfeldes kann mit default (Zeichenkette oder NIL für ein leeres Feld) gesetzt werden. Wird das optionale Argument titles angegeben und ist nicht NIL, so wird ein Listenkopf mit dem Inhalt von titles angezeigt. Für ein mehr-spaltiges Format kann titles als eine Liste von Spaltenüberschriften angegeben werden.
Sowohl strings als auch titles können durch einen mehrzeiligen Text
und eine Zeichenkette (anstatt von Listen) angegeben werden.
In diesem Fall werden diese automatisch durch Aufrufen von
(MEMOTOLIST strings TRUE)
(siehe MEMOTOLIST), bzw.
(STRTOLIST titles)
(siehe STRTOLIST) in Listen umgewandelt.
ASKCHOICESTR
liefert die ausgewählte Zeichenkette oder NIL, wenn der
Benutzer das Fenster mit Abbrechen verlassen hat.
Beispiel
(LET ((strings (LIST "Claudia" "Mats" "Ralphie")) likebest) (SETQ likebest (ASKCHOICESTR "Wen mögen Sie am liebsten?" "Ok" strings "Meine Collie-Hunde!" ) ) (IF likebest (PRINTF "Benutzer wählte <%s>\n" likebest)) ) |
Siehe auch ASKCHOICE, ASKOPTIONS.
16.16.7 ASKOPTIONS
ASKOPTIONS
erlaubt dem Benutzer mehreren Optionen
aus einer Liste auszuwählen.
|
Öffnet ein Eingabefenster, das dem Benutzer erlaubt, mehrere Optionen aus einer Liste auszuwählen. Der Fenstertitel und der Text des `Ok'-Knopfes können mit title und oktext (Zeichenketten oder NIL für Vorgabewerte) gesetzt werden. In options wird eine Liste der Optionen angegeben. Es kann ein mehr-spaltiges Format verwendet werden, indem jede Option als eine Liste von Unterelementen angegeben wird. Die Vorgabeauswahl der Optionen lässt sich in selected festlegen, welche eine Liste von Index-Zahlen enthält, die jeweils den entsprechenden Eintrag in options angibt, die vorab ausgewählt werden soll. Für keine Vorauswahl wird NIL anstatt einer Liste von Index-Zahlen angegeben. Wird das optionale Argument titles angegeben und ist nicht NIL, so wird ein Listenkopf mit dem Inhalt von titles angezeigt. Für ein mehr-spaltiges Format kann titles als eine Liste von Spaltenüberschriften angegeben werden.
Sowohl options als auch titles können durch einen mehrzeiligen Text
und eine Zeichenkette (anstatt von Listen) angegeben werden.
In diesem Fall werden diese automatisch durch Aufrufen von
(MEMOTOLIST options TRUE)
(siehe MEMOTOLIST), bzw.
(STRTOLIST titles)
(siehe STRTOLIST) in Listen umgewandelt.
ASKOPTIONS
liefert eine Liste von Ganzzahlen, die den Index der
ausgewählten Elemente enthält oder NIL, wenn der Benutzer das Fenster mit
Abbrechen verlassen oder kein Element ausgewählt hat.
Beispiel
(LET ((options (LIST "Salva Mea" "Insomnia" "Don't leave" "7 days & 1 week")) (selected (LIST 0 1 3)) ) (SETQ selected (ASKOPTIONS "Wähle Musiktitel" "Ok" options selected)) (IF selected ( (PRINTF "Benutzer wählte folgende Einträge:\n") (DOLIST (i selected) (PRINTF "\tNummer %i enthält: <%s>\n" i (STR (NTH i options)) ) ) ) ) ) |
(Anm.d.Übersetzers: Hier hören Entwickler und Übersetzer die gleiche Musik von Faithless :-)
16.16.8 ASKBUTTON
ASKBUTTON
fragt den Benutzer nach einen Knopfdruck.
|
Öffnet ein Eingabefenster mit dem gegebenen Fenstertitel title (als Zeichenkette oder NIL für einen Vorgabetitel) und dem gegebenen Beschreibungstext text (als Zeichenkette oder NIL für keinen Text). Die Funktion wartet auf einen Druck der in buttons (als Liste von Zeichenketten) festgelegten Knöpfe oder des `Abbrechen'-Knopfes. Der Text des Abbruchknopfes lässt sich mit canceltext ändern. Wird hier NIL angegeben, dann wird ein Vorgabetext verwendet, der sich nach der Anzahl der festgelegten Knöpfe richtet.
ASKBUTTON
liefert die Nummer des gedrückten Knopfes (beginnend bei 0
mit dem am weitesten links angeordneten Knopf) oder NIL, wenn der Benutzer
den `Abbruch'-Knopf gedrückt hat.
Beispiele
(LET ((buttons (LIST "Zuhause" "Im Bett" "Vor meinem Computer")) index) (SETQ index (ASKBUTTON "Bitte beantworten:" "Wo werden Sie morgen sein?" buttons "Weiß nicht") ) (IF index (PRINTF "Benutzer entschied sich für: <%s>\n" (NTH index buttons)) ) ) (ASKBUTTON "Info" "Ich finde BeeBase spitze!" NIL NIL) |
Siehe auch ASKCHOICE.
16.16.9 ASKMULTI
ASKMULTI
fragt den Benutzer nach verschiedenartigen Informationen.
|
ASKMULTI
ist ein Mehrzweck-Eingabefenster. Es öffnet ein Fenster mit
dem angegebenen Titel title, einem Satz von grafischen Objekten für die
Dateneingabe und zwei Knöpfen (`Ok' und `Abbrechen') zum Beenden
des Eingabefensters. Der Text für den `Ok'-Knopf kann mit oktext
verändert werden (als Zeichenkette oder NIL für einen Vorgabetext). Der
Satz der grafischen Objekte werden in itemlist festgelegt, das eine
Liste ein Elementen ist, in der jedes eine der folgenden Formate hat:
|
Der Titel title (als Zeichenkette oder NIL für keinen Titel) wird links neben dem grafischen Objekt angeordnet. Ist der Vorgabewert initial NIL, dann wird ein Vorgabewert verwendet (z.B. ein leeres Textfeld). Für Auswahlfelder muss der Vorgabewert der Index (beginnend bei 0) sein, für Auswahllistenfelder darf der Vorgabewert NIL (kein Eintrag ausgewählt) sein und für Optionsfelder muss der Vorgabewert eine Liste von Ganzzahlen sein, die die Indexe (beginnend bei 0) der Elemente sein, die vorbelegt sein sollen. Das optionale Hilfsfeld (eine Zeichenkette) kann verwendet werden, um dem Benutzer mehr Informationen über die Verwendung des Feldes mitzugeben. Für Zeichenkettenfelder kann ein weitere Parameter `secret' angegeben werden. Ist dieser nicht NIL, so wird die eingegebene Zeichnkette unsichtbar gemacht, indem ein Aufzählungszeichen für jedes Zeichen der Zeichenkette angezeigt wird.
ASKMULTI
liefert eine Liste von Werten, die der Benutzer bearbeitet
und über den `Ok'-Knopf bestätigt hat. Jeder Ergebniswert eines Feldes
hat das gleiche Format wie der für den Vorgabewert, z.B. für ein
Auswahllistenfeld ist der Rückgabewert der Index des ausgewählten Elements
(oder NIL, wenn keines ausgewählt wurde) oder für Optionsfelder ist er die
Liste von Ganzzahlen, die die Indexe der ausgewählten Elemente darstellen.
Für statischen Text wird NIL zurückgegeben.
Wurde z.B. ein Datumsfeld, ein statischer Text, ein Auswahlfeld, ein Optionsfeld und ein Zeichenkettenfeld mit dem Vorgabewert "Welt" festgelegt und der Benutzer gab 11.11.1999 ein, wählte den Auswahleintrag mit dem Index 2, wählte das dritte und vierte Element des Optionsfeldes und ließ das Zeichenkettenfeld unberührt, dann liefert die Funktion die Liste ( 11.11.1999 NIL 2 ( 3 4 ) "world" ).
Brach der Benutzer das Eingabefenster ab, wird NIL geliefert.
Beispiel
(ASKMULTI "Bitte bearbeiten:" NIL (LIST (LIST "_Name" "String" "") (LIST "_Geburtstag" "Date" NIL) (LIST "Ge_schlecht" "Choice" 0 (LIST "männlich" "weiblich")) (LIST "_Hat ein Auto?" "Bool" NIL) (LIST "_Mag" "Options" (LIST 0 2) (LIST "Bier" "Wein" "Whisky" "Wodka" "Schnaps") )) ) |
Man sehe sich auch das Projekt `AskDemo.bbs' für weitere Beispiele an.
16.17 E/A-Funktionen
Dieser Abschnitt listet die Funktionen und Variablen zur Dateiein- und ausgabe (z.B. drucken) auf.
16.17.1 FOPEN | Öffnet eine Datei zum Lesen/Schreiben. | |
16.17.2 FCLOSE | Schließt eine Datei. | |
16.17.3 stdout | Standard-Ausgabedateihandler. | |
16.17.4 PRINT | Gibt einen Ausdruck nach stdout aus. | |
16.17.5 PRINTF | Formatierte Ausgabe nach stdout. | |
16.17.6 FPRINTF | Formatierte Ausgabe in eine Datei. | |
16.17.7 FERROR | Fehlerprüfung einer Datei. | |
16.17.8 FEOF | Ende-Erkennung einer Datei. | |
16.17.9 FSEEK | Setzt Position in einer Datei. | |
16.17.10 FTELL | Ermittelt Position in einer Datei. | |
16.17.11 FGETCHAR | Liest das nächste Eingabezeichen aus einer Datei. | |
16.17.12 FGETCHARS | Liest mehrere Eingabezeichen aus einer Datei. | |
16.17.13 FGETSTR | Liest eine Zeichenkette aus einer Datei. | |
16.17.14 FGETMEMO | Liest einen mehrzeiligen Text aus einer Datei. | |
16.17.15 FPUTCHAR | Schreibt ein Zeichen in eine Datei. | |
16.17.16 FPUTSTR | Schreibt eine Zeichenkette in eine Datei. | |
16.17.17 FPUTMEMO | Schreibt einen mehrzeiligen Text in eine Datei. | |
16.17.18 FFLUSH | Leert den Schreibpuffer einer Datei. |
16.17.1 FOPEN
FOPEN
öffnet eine Datei zum Lesen/Schreiben.
|
Öffnet eine Datei mit dem Dateinamen filename (Zeichenkette). Das Argument mode (Zeichenkette) steuert den Zugriff auf die Datei. Mit `"w"' wird die Datei zum Schreiben geöffnet, mit `"a"' zum Anfügen an die bestehende Datei und mit `"r"' zum Lesen aus einer Datei. Es sind auch andere Zeichen (oder Kombinationen von ihnen) möglich, wie z.B. `"r+"' zum Lesen und Schreiben. Es gibt keine Überprüfung, ob die angegebenen Modi gültig sind. Es wird jedoch NIL zurückgeliefert, wenn die Datei nicht geöffnet werden konnte.
Der optionale Parameter encoding gibt die Textkodierung der Datei an und kann eine der folgenden Zeichenketten sein:
- `"none"':
- Keine Interpretation von Zeichen wird vorgenommen. Dies ist für Binärdateien.
- `"UTF-8"':
- Text ist in UTF-8 kodiert.
Lesen und Schreiben wandelt von/in UTF-8 um.
- `"locale"':
- Text ist in der Systemlokalisierung kodiert.
Auf Windows is dies die System-Codepage.
Unter Mac OS und Linux ist dies die Einstellung in den
LANG
- undLC_*
-Umgebungsvariablen (sieheman locale
). Beim Amiga ist es die voreingestellte 8-Bit-Kodierung. - `"8-bit"':
- Text ist in der voreingestellten 8-Bit-Kodierung abgelegt.
Auf Windows, Mac OS und Linux ist dies die ISO-8859-1-Kodierung (Latin 1).
Auf dem Amiga ist es die im System voreingestellte 8-Bit-Kodierung
(gleich wie `locale').
- `"auto"':
- Die Kodierung wird automatisch ermittelt. Ist die Datei lesbar, so wird die Kodierung wie folgt ermittelt: Ist der gesamte Inhalt UTF-8 konform, so wird `"UTF-8"' verwendet. Sonst, wenn die Systemlokalisierung nicht UTF-8 ist, so wird `"locale"' angenommen. Ansonsten wird `"8-bit"' verwendet. Beim Schreiben wird, sofern die Kodierung noch nicht festgelegt wurde, zuerst versucht in der Systemlokalisierung zu schreiben. Sofern es keine Umwandlungsfehler gab, wird `"locale"' verwendet, ansonsten wird `"UTF-8"' verwendet.
Wird kein encoding-Parameter angegeben, so wird `"auto"' verwendet.
FOPEN
liefert bei Erfolg einen Dateihandler.
Schlug er fehl, wird NIL geliefert.
Sind filename, mode oder encoding NIL,
dann wird NIL zurückgeliefert.
Beispiele
`(FOPEN "index.html" "w" "utf-8")' öffnet und liefert einen Dateihandler zum Schreiben der Datei `index.html', welche in UTF-8 kodiert wird.
`(FOPEN "output.txt" "a+")' öffnet die Datei `output.txt' zum Anhängen und verwendet die in der Datei bereits vorhandene Textkodierung. Zu beachten ist, dass wenn nur `"a"' als Mode verwendet wird, BeeBase die Datei möglicherweise nicht lesen kann und von daher die vorhandene Textkodierung nicht bestimmen kann. In diesem Fall wird die Kodierung beim Schreiben festgelegt (und ist möglicherweise eine andere als die bereits bestehende).
Siehe auch FCLOSE, stdout, FFLUSH.
16.17.2 FCLOSE
FCLOSE
schließt eine Datei.
|
Schließt die gegebene Datei und liefert 0 bei Erfolg oder NIL, wenn ein Fehler auftrat. Ist file NIL, dann wird 0 geliefert (kein Fehler). Der Zugriff auf eine Datei nach dem Schließen einer Datei ist eine illegale Operation und führt zum Abbruch der Programmausführung mit einer Fehlermeldung.
16.17.3 stdout
Die globale Variable stdout
trägt den Dateihandler zur Standardausgabe
von BeeBase. Der Ausgabedateinamen kann im Menüpunkt `Programm -
Ausgabedatei' gesetzt werden
(siehe Programm-Ausgabedatei).
Die Datei wird beim ersten Zugriff auf diese Variable (z.B. durch den Aufruf von `(FPRINTF stdout ...)' oder durch den Aufruf von `(PRINTF ...)') geöffnet. Die Datei wird nicht vor der Programmausführung geöffnet. Dies verhindert das Öffnen der Datei, wenn keine Ausgabe erzeugt wird, z.b. wenn nur Berechnungen und Änderungen an einigen Datensätzen durchgeführt werden sollen.
Beim Öffnen der Datei wird als Mode-Parameter entweder `"w"' oder `"a+"' in Abhängigkeit der `Anhängen'-Einstellung in Menüpunkt `Programm - Ausgabedatei' verwendet. Als Kodierung wird `"auto"' eingesetzt.
Wenn BeeBase die Programmausgabedatei nicht öffnen kann, dann wird die Ausführung unterbruchen und eine Fehlermeldung ausgegeben.
16.17.4 PRINT
PRINT
wandelt einen Ausdruck in eine Zeichenkette und gibt ihn aus.
|
Wandelt den Wert von elem in eine lesbare Zeichenkette und gibt ihn
über stdout
aus.
Diese Funktion ist hauptsächlich zu Prüfzwecken vorhanden und wird nicht als
eine Funktion mit Seiteneffekt betrachtet, so dass sie z.B. in einer
Vergleichsfunktion eingesetzt werden kann.
Siehe auch PRINTF, stdout, Vergleichsfunktion.
16.17.5 PRINTF
PRINTF
gibt eine formatierte Zeichenkette aus.
|
Formatiert eine Zeichenkette aus der gegebenen Formatzeichenkette und seinen
Parameter und gibt sie an stdout
aus.
Die Formatierung entspricht der von SPRINTF
(siehe SPRINTF).
PRINTF
liefert die Anzahl der ausgegebenen Zeichen oder NIL bei einem
Fehler. Ist format NIL, dann wird NIL geliefert.
Diese Funktion wird nicht als eine Funktion mit Seiteneffekt betrachtet, so dass sie z.B. zu Prüfzwecken in einer Vergleichsfunktion eingesetzt werden kann.
Beispiel: `(PRINTF "%i Tage und %i Woche" 7 1)' gibt die Zeichenkette
"7 Tage und 1 Woche" nach stdout
aus und liefert 18.
Siehe auch PRINT, FPRINTF, stdout, Vergleichsfunktion.
16.17.6 FPRINTF
FPRINTF
gibt eine formatierte Zeichenkette in eine Datei aus.
|
Formatiert eine Zeichenkette aus der gegebenen Formatzeichenkette und seinen
Parameter und gibt sie in die angegebene Datei aus.
Die Formatierung entspricht der von SPRINTF
(siehe SPRINTF).
PRINTF
liefert die Anzahl der ausgegebenen Zeichen oder NIL bei einem
Fehler. Ist file NIL, dann liefert FPRINTF
dennoch die Anzahl
der potentiell geschriebenen Zeichen zurück, macht aber keine Ausgabe.
Ist format NIL, dann wird NIL geliefert.
16.17.7 FERROR
FERROR
prüft, on ein Ein-/Ausgabefehler einer Datei aufgetreten ist.
|
liefert TRUE, wenn ein Fehler bei der gegebenen Datei auftrat, anderenfalls NIL. Ist `file' NIL, wird NIL geliefert.
Siehe auch FEOF, FOPEN, FCLOSE.
16.17.8 FEOF
FEOF
prüft auf den Endestatus einer Datei.
|
Überprüft den Dateende-Indikator der gegebenen Datei und liefert TRUE, wenn er gesetzt ist, anderenfalls NIL. Ist `file' NIL, wird NIL geliefert.
Siehe auch FERROR, FTELL, FOPEN, FCLOSE.
16.17.9 FSEEK
FSEEK
setzt die Schreib-/Leseposition in einer Datei.
|
Setzt die Schreib-/Leseposition für die gegebene Datei. Die neue Position -gemessen in Bytes- wird erreicht durch das Hinzufügen von offset bytes bezogen auf die Position, die durch whence festgelegt wird. Ist whence auf SEEK_SET, SEEK_CUR oder SEEK_END gesetzt, dann ist offset relativ zum Beginn der Datei, der aktuellen Position beziehungsweise zum Ende der Datei.
Bei Erfolg liefert FSEEK
0, anderenfalls NIL und die
Dateiposition bleibt unverändert.
Ist file, offset oder whence NIL, oder ist
whence nicht eine der Konstanten SEEK_SET, SEEK_CUR oder
SEEK_END, dann wird NIL geliefert.
Zu beachten ist, dass nach einer Lese-Operation, der Aufruf von FSEEK
mit whence als SEEK_CUR nur für die Zeichenkodierung `"none"'
unterstützt wird.
Siehe auch FTELL, FOPEN, Vordefinierte Konstanten.
16.17.10 FTELL
FTELL
liefert die Schreib-/Leseposition der Datei.
|
Ermittelt die aktuelle Schreib-/Leseposition relativ zum Anfang der gegebenen Datei und liefert sie als Ganzzahl. Tritt ein Fehler auf oder ist `file' NIL, dann wird NIL geliefert.
Zu beachten ist, dass nach einer Lese-Operation, der Aufruf von FTELL
nur für die Zeichenkodierung `"none"' unterstützt wird.
Siehe auch FSEEK, FOPEN, FEOF.
16.17.11 FGETCHAR
FGETCHAR
liest ein Zeichen aus einer Datei.
|
Liefert das nächste Zeichen von der gegebenen Datei als Zeichenkette oder NIL, wenn file NIL ist, das Ende der Datei erreicht wurde oder ein Fehler auftrat. Ist das nächste Zeichen ein Nullbyte, dann wird eine leere Zeichenkette geliefert.
Siehe auch FGETCHARS, FGETSTR, FPUTCHAR.
16.17.12 FGETCHARS
FGETCHARS
liest Zeichen aus einer Datei.
|
liefert eine Zeichenkette, die die nächsten num Zeichen aus der gegebenen Datei enthält. Ist das Ende der Datei erreicht worden, bevor num Zeichen gelesen werden konnten, oder wenn ein Nullbyte gelesen wurde, dann werden nur die bisher gelesenen Zeichen zurückgegeben. Ist num oder file NIL, num negativ, das Ende der Datei erreicht worden, bevor das erste Zeichen gelesen wurde, oder ein Lesefehler aufgetreten, dann wird NIL zurückgeliefert.
16.17.13 FGETSTR
FGETSTR
liest eine Zeichenkette aus einer Datei.
|
liefert die nächste Zeile aus der gegebenen Datei oder NIL, falls file NIL ist, das Ende der Datei erreicht wurde oder ein Fehler auftrat. Das Ende einer Zeile wird entweder durch ein Neue-Zeile-Zeichen oder durch ein Nullbyte gekennzeichnet oder falls das Ende der Datei erkannt wurde. In jedem Fall enthält die Zeichenkette keine Neue-Zeile-Zeichen.
Siehe auch FGETCHAR, FGETCHARS, FGETMEMO, FPUTSTR.
16.17.14 FGETMEMO
FGETMEMO
liest einen mehrzeiligen Text aus einer Datei.
|
liefert einen mehrzeiligen Text, der den Inhalt der gegebenen Datei bis zum nächsten Nullbyte oder zum Ende der Datei enthält. Ist file NIL, das Ende der Datei erreicht worden, bevor ein Zeichen gelesen wurde oder trat ein Fehler auf, dann wird NIL zurückgeliefert.
16.17.15 FPUTCHAR
FPUTCHAR
schreibt ein Zeichen in eine Datei.
|
Schreibt das erste Zeichen von str in die gegebene Datei. Ist str leer, dann wird ein Nullbyte geschrieben. Sind str
file NIL, dann passiert nichts. Liefert str oder NIL, wenn ein Ausgabefehler auftrat.
16.17.16 FPUTSTR
FPUTSTR
schreibt eine Zeichenkette in eine Datei.
|
Gibt str zusammen mit einem Neue-Zeile-Zeichen in die gegebene Datei aus. Sind str oder file NIL, dann passiert nichts. Liefert str oder NIL, wenn ein Ausgabefehler auftrat.
Siehe auch FPUTCHAR, FPUTMEMO, FGETSTR.
16.17.17 FPUTMEMO
FPUTMEMO
schreibt einen mehrzeiligen Text in eine Datei.
|
Gibt memo in die gegebene Datei aus. Sind memo oder file NIL, dann passiert nichts. Liefert memo oder NIL, wenn ein Ausgabefehler auftrat.
16.17.18 FFLUSH
FFLUSH
leert den Schreibpuffer in eine Datei.
|
Schreibt den Schreibpuffer der gegebenen Datei. Liefert 0 bei Erfolg, NIL bei einem Fehler. Ist file NIL, dann wird 0 zurückgegeben (kein Fehler).
16.18 Datensatzfunktionen
Dieser Abschnitt behandelt Funktionen für Datensätze.
16.18.1 NEW | Neuen Datensatz anlegen. | |
16.18.2 NEW* | Neuen Datensatz durch Aufruf der Auslösefunktion anlegen. | |
16.18.3 DELETE | Datensatz löschen. | |
16.18.4 DELETE* | Datensatz durch Aufruf der Auslösefunktion löschen. | |
16.18.5 DELETEALL | Löschen aller Datensätze einer Tabelle. | |
16.18.6 GETMATCHFILTER | Holt den Zustand der Filterübereinstimmung eines Datensatzes. | |
16.18.7 SETMATCHFILTER | Setzt den Zustand der Filterübereinstimmung eines Datensatzes. | |
16.18.8 GETISSORTED | Prüft, ob ein Datensatz einsortiert ist. | |
16.18.9 SETISSORTED | Übergibt einem Datensatz den Sortierstatus. | |
16.18.10 GETREC | Holt die Datensatzreferenz eines Ausdrucks. | |
16.18.11 SETREC | Setzt die Datensatzreferenz eines Ausdrucks. | |
16.18.12 RECNUM | Holt die Nummer eines Datensatzes. | |
16.18.13 MOVEREC | Schiebt einen Datensatz an eine neue Position. | |
16.18.14 COPYREC | Kopiert den Inhalt eines Datensatzes. |
16.18.1 NEW
NEW
legt einen neuen Datensatz für eine Tabelle an.
|
Legt einen neuen Datensatz für die gegebene Tabelle an. Das Argument init legt den Datensatz fest, der zum Einrichten des neuen Datensatzes verwendet werden soll. Ein Wert von NIL steht für den Vorgabedatensatz.
NEW
liefert den Datensatzzeiger für den neuen Datensatz.
Die Funktion NEW
hat zudem den Nebeneffekt, dass der
Programm-Datensatzzeiger der gegebenen Tabelle
(siehe Tabellen) auf den
neuen Datensatz gesetzt wird.
Beispiel: `(NEW table NIL)' legt einen neuen Datensatz in der gegebenen Tabelle an und richtet ihn mit dem Vorgabedatensatz ein.
Siehe auch NEW*, DELETE, Tabellen.
16.18.2 NEW*
NEW*
ist die Version von NEW
(siehe NEW) mit dem Stern.
|
NEW*
prüft, ob eine Auslösefunktion für die gegebene Tabelle
(siehe Auslösefunktion Neu)
definiert wurde. Ist eine vorhanden, dann wird diese
zum Anlegen des Datensatzes ausgeführt und dessen Ergebnis zurückgeliefert.
Das Argument init gibt den Datensatz an, anhand dessen der neue
Datensatz initialisiert werden soll (NIL für den Vorgabedatensatz).
Wurde keine Auslösefunktion eingerichtet, dann verhält sich die Funktion wie
NEW
.
Achtung: Mit dieser Funktion ist es möglich, Endlosschleifen zu schreiben,
wenn z.B. für eine Tabelle eine Auslösefunktion für `New' definiert
wurde und diese Funktion NEW*
aufruft, um den Datensatz anzulegen.
16.18.3 DELETE
DELETE
löscht einen Datensatz einer Tabelle.
|
Löscht den aktuellen Programm-Datensatz der gegebenen Tabelle, nachdem ein optionales Löschfenster bestätigt wurde. Das erste Argument definiert die Tabelle, für die der aktuelle Programm-Datensatz gelöscht werden soll und das zweite ist ein Boolescher Ausdruck. Ist dieser NIL, dann wird der Datensatz stillschweigend gelöscht, anderenfalls wird der Status des Menüpunkts `Datensätze löschen bestätigen?' geprüft. Ist dieser nicht gesetzt, dann wird der Datensatz auch stillschweigend gelöscht, anderenfalls erscheint das Löschbestätigungsfenster, das bestätigt werden muss. Bricht der Benutzer die Löschfunktion ab, dann wird der Datensatz nicht gelöscht.
Der Rückgabewert der Funkion DELETE
wiederspiegelt die ausgewählte
Aktion. Liefert sie TRUE, dann ist der Datensatz gelöscht worden,
anderenfalls NIL (wenn der Benutzer die Funktion unterbrochen hat).
Beim Löschen setzt DELETE
den Programm-Datensatzzeiger
(siehe Tabellen) der gegebenen Tabelle auf NIL.
Beispiel: `(DELETE table NIL)' löscht stillschweigend den aktuellen Datensatz der gegebenen Tabelle.
Siehe auch DELETE*, DELETEALL, NEW, Tabellen.
16.18.4 DELETE*
DELETE*
ist die Version von DELETE
(siehe DELETE) mit dem
Stern.
|
DELETE*
prüft, ob eine Auslösefunktion für die gegebene Tabelle
(siehe Auslösefunktion Löschen)
definiert wurde. Ist eine vorhanden, dann wird diese
zum Löschen des Datensatzes ausgeführt und dessen Ergebnis zurückgeliefert.
Das Argument confirm gibt an, ob die Auslösefunktion ein
Bestätigungsfenster öffnen soll, bevor der Datensatz gelöscht wird.
Wurde keine Auslösefunktion eingerichtet, dann verhält sich die Funktion wie
DELETE
.
Achtung: Mit dieser Funktion ist es möglich, Endlosschleifen zu schreiben,
wenn z.B. für eine Tabelle eine Auslösefunktion für `Delete' definiert
wurde und diese Funktion DELETE*
aufruft, um den Datensatz zu löschen.
Siehe auch DELETE, DELETEALL, NEW*.
16.18.5 DELETEALL
DELETEALL
löscht alle Datensätze einer Tabelle.
|
Löscht alle Datensätze der gegebenen Tabelle. Wird ein Stern hinter dem Tabellennamen angehängt, dann werden nur die Datensätze gelöscht, die dem aktuellen Filter der Tabelle genügen. Es erscheint kein Sicherheitsfenster, bevor dir Datensätze gelöscht werden!
DELETEALL
liefert TRUE, wenn alle Datensätze erfolgreich gelöscht
werden konnten, anderenfalls NIL. Ist table NIL, dann wird NIL
geliefert.
Beispiel: `(DELETEALL table*)' löscht alle Datensätze in der gegebenen Tabelle, die dem Filter der Tabelle genügen.
16.18.6 GETMATCHFILTER
GETMATCHFILTER
liefert den Status der Filterübereinstimmung eines
Datensatzes.
|
Liefert TRUE, wenn der gegebene Datensatz dem Filter seiner Tabelle entspricht, anderenfalls NIL. Ist der Filter der Tabelle momentan nicht aktiviert, dann wird TRUE geliefert. Ist rec NIL (der Vorgabedatensatz), dann wird NIL geliefert.
Siehe auch SETMATCHFILTER, GETISSORTED, GETFILTERSTR, SETFILTERSTR.
16.18.7 SETMATCHFILTER
SETMATCHFILTER
setzt den Status der Filterübereinstimmung eines
Datensatzes.
|
Ändert den Status der Filterübereinstimmung beim gegebenen Datensatz auf den
Wert von on.
SETMATCHFILTER
liefert den neuen Status der Filterübereinstimmung des
gegebenen Datensatzes. Der neue Status kann vom erwarteten abweichen, weil
das Setzen auf NIL nur dann wirksam ist, wenn der Filter der dazugehörigen
Tabelle aktiviert ist, anderenfalls wird TRUE geliefert.
Der Aufruf von SETMATCHFILTER
mit dem Wert NIL für rec (der
Vorgabedatensatz) liefert immer NIL.
Siehe auch GETMATCHFILTER, SETISSORTED, GETFILTERSTR, SETFILTERSTR.
16.18.8 GETISSORTED
GETISSORTED
liefert den Sortierstatus eines Datensatzes.
|
Liefert TRUE, wenn der gegebene Datensatz nach der für die Tabelle definierten Reihenfolge sortiert ist, ansonsten NIL. Ist rec NIL, dann wird NIL geliefert.
Siehe auch SETISSORTED, GETMATCHFILTER, REORDER, GETORDERSTR, SETORDERSTR, Vergleichsfunktion.
16.18.9 SETISSORTED
SETISSORTED
setzt den Sortierstatus eines Datensatzes.
|
Ändert den Sortierstatus des angegebenen Datensaztes auf on.
Die Funktion wird verwendet, wenn man der Meinung ist, dass der
Datensatz in der richtigen Reihenfolge steht (on = TRUE)
oder er neu sortiert werden sollte (on = NIL).
Neusortieren aller unsortierten Datensätze kann mit der
Funktion REORDER
(siehe REORDER) durchgeführt
werden.
SETISSORTED
liefert den neuen Sortierstatus des gegebenen
Datensatzes. Der Aufruf von SETISSORTED
mit dem Wert NIL
für rec (der Anfangsdatensatz) wird NIL liefern.
Für ein Beispiel, wie diese Funktion angewendet wird, siehe Vergleichsfunktion.
Siehe auch GETISSORTED, SETMATCHFILTER, REORDER, GETORDERSTR, SETORDERSTR, Vergleichsfunktion.
16.18.10 GETREC
GETREC
liefert die Datensatzreferenz eines Ausdrucks.
|
Liefert den Datensatz, welcher für die Erstellung von expr verwendet wurde. Ausdrücke, welche von einem Feld einer Tabelle stammen, haben den Datensatz aus dem sie generiert wurden als Datensatzreferenz.
Falls expr eine Liste ist und nicht selbst eine Datensatzreferenz hat,
dann liefert GETREC
den Datensatz des ersten Listenelements,
welches eine Datensatzreferenz hat.
GETREC
untersucht aber keine Unterlisten.
Falls keine Datensatzreferenz gefunden wurde,
dann liefert GETREC
NIL zurück.
Die Eigenschaft Element einer Liste zu untersuchen ist nützlich, um die Datensatzreferenz einer Zeile in einer Select-from-where-Abfrage zu bestimmen. Z.B. liefert das folgende Programmfragment den Datensatz, welcher zur Erstellung der 7. Zeile in einer Select-from-where-Abfrage benutzt wurde.
(GETREC (NTH 7 (SELECT field FROM table))) |
Diese Funktion ist nützlich in einer Auslösefunktion für das Sortieren-Drop in einer virtuellen Liste, siehe Auslösefunktion Sortieren-Drop.
Siehe auch SETREC, RECORD, Auslösefunktion Sortieren-Drop.
16.18.11 SETREC
SETREC
setzt die Datensatzreferenz eines Ausdrucks.
|
Liefert expr mit einer Datensatzreferenz zu record zurück.
SETREC
ist nützlich, wenn ein Ausdruck mit einem bestimmten Datensatz
assoziiert werde soll, z.B. beim Berechnen von Informationen, die von einem
Feld in einer Tabelle abstammen.
Zum Beispiel kann in einer Tabelle `Person'
mit einem Booleschen Feld `Female' eine Select-from-where-Abfrage
das Feld `Female' auf die Zeichenketten "F" und "M" umlegen:
SELECT (SETREC (IF Female "F" "M") Person) FROM Person |
Mit dem SETREC
-Befehl werden "F" und "M" jetzt mit dem Datensatz,
aus dem diese generiert wurden assoziiert,
was z.B. in einem virtuellen Listenfeld,
welches dies Abfrage verwendet, ermöglicht, das Öffnen des zugehörigen
Datensatz per Doppelklick zu unterstützen
(siehe Feldobjekteditor) .
Siehe auch GETREC.
16.18.12 RECNUM
RECNUM
liefert die Datensatznummer des Datensatzes.
|
Liefert die Datensatznummer des gegebenen Datensatzes. Man beachte, dass die Nummerierung der Datensätze von z.B. der der Listen abweicht. Bei Listen, Zeicheketten und anderem beginnt die Zählung bei Null, bei den Datensätzen beginnt sie jedoch bei 1. Die Nummer 0 ist für den Vorgabedatensatz reserviert. Dies scheint mit den restlichen BeeBase-Funktionen unvereinbar zu sein, aber hier macht es wirklich Sinn, da die Datensatznummern auch in der Fensteranzeige verwendet werden.
Siehe auch RECORDS, MOVEREC, INT.
16.18.13 MOVEREC
MOVEREC
schiebt einen Datensatz an eine neue Position.
|
Verschiebt den gegebenen Datensatz an die gegebene Position in the Tabelle, so dass die Datensatznummer zu pos wird. Man beachte, dass Datensatznummern mit 1 für die erste Position beginnen. Liefert die neue Datensatznummer zurück oder NIL, falls das Verschieben des Datensatzes fehlschlägt, z.B. wenn pos nicht zwischen 1 und der Anzahl Datensätze in the Tabelle liegt.
Falls der Datensatz verschoben wurde, dann wird auch der Sortierstatus des Datensatzes gelöscht. Zu beachten ist, dass wenn eine Tabelle eine definierte Ordnung hat, das Neuordnen aller Datensätze den Datensatz wieder an seinen Platz verschiebt. Von daher ist diese Funktion hauptsächlich nützlich in Tabellen, die keine definierte Ordnung haben.
Diese Funktion ist nützlich in einer Auslösefunktion für das Sortieren-Drop in einer virtuellen Liste, siehe Auslösefunktion Sortieren-Drop.
Siehe auch RECNUM, GETISSORTED, Auslösefunktion Sortieren-Drop.
16.18.14 COPYREC
COPYREC
kopiert Datensätze.
|
Kopiert den Inhalt des Datensatzes source in den Datensatz rec. Ist source NIL, dann wird rec auf die Werte des Vorgabedatensatzes gesetzt. Ist rec NIL, dann wird eine Fehlermeldung erzeugt.
COPYREC
liefert rec.
Siehe auch NEW.
16.19 Feldfunktionen
Dieser Abschnitt behandelt Funktionen für Felder einer Tabelle.
16.19.1 FIELDNAME | Holen des Namens eines Feldes. | |
16.19.2 MAXLEN | Maximale Anzahl von Zeichen eines Zeichenkettenfeldes. | |
16.19.3 GETLABELS | Holen der Auswahltexte eines Auswahl- oder Zeichenkettenfeldes. | |
16.19.4 SETLABELS | Setzen der Auswahltexte eines Auswahl- oder Zeichenkettenfeldes. |
16.19.1 FIELDNAME
FIELDNAME
liefert den Namen des Feldes.
|
Liefert eine Zeichenkette mit dem Namen des angegebenen Feldes.
Siehe auch TABLENAME
16.19.2 MAXLEN
MAXLEN
liefert die maximale Anzahl von Zeichen eines
Zeichenkettenfeldes.
|
Liefert die maximale Anzahl von Zeichen, die das gegebene Zeichenkettenfeld aufnehmen kann.
Siehe auch LEN.
16.19.3 GETLABELS
GETLABELS
liefert alle Auswahltexte eines Auswahl- oder
Zeichenkettenfeldes.
|
Liefert die Auswahltexte des gegebenenen Auswahl- oder Zeichenkettenfeldes. Im Falle eines Auswahlfeldes werden die im Auswahltexteditor (siehe Typabhängige Einstellungen) eingegebenen Texte zurückgegeben, Bei Zeichenkettenfeldern werden die statischen Auswahltexte zurückgegebene, die für das Listenansicht-Popup (siehe Feldobjekteditor) eingegeben wurden (zu beachten ist, dass diese Funktion nur für statische Auswahltexte sinnvoll ist).
Die Auswahltexte werden in einer einzelnen Zeichenkette zurückgegeben und werden jeweils durch ein Neue-Zeile-Zeichen getrennt.
Beispiel: Man nehme an, man hat ein Auswahlfeld mit den Auswahltexten
`Auto', `Haus' und `Öl'.
Der Aufruf von GETLABELS
mit diesem Feld liefert dann die Zeichenkette
"Auto\nHaus\nÖl".
Hinweis: Diese Rückgabezeichenkette lässt sich einfach mit MEMOTOLIST
(siehe MEMOTOLIST) in eine Liste umwandeln.
Siehe auch SETLABELS.
16.19.4 SETLABELS
SETLABELS
wird verwendet, um die Auswahltexte eines
Zeichenkettenfeldes zu setzen.
|
Setzt die statischen Auswahltexte des Zeichenkettenfeldes field auf die Auswahlfelder, die im Parameter str aufgelistet sind. Der Parameter str enthält für jeden Auswahltext eine Zeile. Die Auswahltexte ersetzen diejenigen, die in dem Listenansicht-Popup des Feldobjekteditors (siehe Feldobjekteditor) eingegeben wurden. Zu beachten ist, dass diese Funktion nur für statische Auswahltexte sinnvoll ist.
SETLABELS
liefert den Wert des Parameters str.
Beispiel: `(SETLABELS Table.String "Mein Haus\nist\ndein Haus")' setzt die statischen Listenansicht-Auswahltexte des gegebenen Zeichenkettenfeldes auf `Mein Haus', `ist' und `dein Haus'.
Hinweis: Man kann eine Liste von Auswahltexte durch den Aufruf von LISTTOMEMO in das benötigte Zeichenkettenformat umwandeln.
Siehe auch GETLABELS.
16.20 Tabellenfunktionen
16.20.1 TABLENAME | Holen des Tabellennamens. | |
16.20.2 GETORDERSTR | Holen der Datensatzreihenfolge. | |
16.20.3 SETORDERSTR | Setzen der Datensatzreihenfolge. | |
16.20.4 REORDER | Unsortierte Datensätze neu sortieren. | |
16.20.5 REORDERALL | Alle Datensätze einer Tabelle neu sortieren. | |
16.20.6 GETFILTERACTIVE | Holen des Datensatzfilterstatus. | |
16.20.7 SETFILTERACTIVE | Setzen des Datensatzfilterstatus. | |
16.20.8 GETFILTERSTR | Holen des Datensatzfilterausdrucks. | |
16.20.9 SETFILTERSTR | Setzen des Datensatzfilterausdrucks. | |
16.20.10 RECORDS | Anzahl der Datensätze. | |
16.20.11 RECORD | Holen eines Zeigers auf einen Datensatz. | |
16.20.12 SELECT | SELECT-FROM-WHERE-Abfragen. |
16.20.1 TABLENAME
TABLENAME
liefert den Namen einer Tabelle.
|
Liefert eine Zeichenkette, die den Namen der angegebenen Tabelle enthält.
Siehe auch FIELDNAME
16.20.2 GETORDERSTR
GETORDERSTR
liefert die Datensatzreihenfolge einer Tabelle.
|
Verwendet die Tabelle eine Felderliste zum Sortieren, dann enthält die gelieferte Zeichenkette die Feldnamen, getrennt durch Leerzeichen. Jedes Feld hat ein `+' oder ein `-' vorangestellt, um eine auf- bzw. absteigende Sortierung anzuzeigen.
Wird die Tabelle anhand einer Vergleichsfunktion sortiert, dann wird der Name dieser Funktion geliefert.
Eine leere Zeichenkette zeigt an, dass keine Sortierung vorliegt.
Beispiel
Angenommen, es gibt eine Tabelle `Person', die nach ihren Feldern `Name' (aufsteigend), `Stadt' (aufsteigend) und `Geburtstag' (absteigend) sortiert ist. Dann liefert `(ORDERSTR Person)' die Zeichenkette "+Name +Stadt -Geburtstag".
Siehe auch SETORDERSTR, REORDER, REORDERALL, GETISSORTED, SETISSORTED, Order, Vergleichsfunktion.
16.20.3 SETORDERSTR
SETORDERSTR
setzt die Sortierreihenfolge einer Tabelle.
|
Setzt die Sortierreihenfolge der gegebenen Tabelle auf die Felder in der Zeichenkette order. Die Zeichenkette order kann entweder eine Liste von Feldnamen enthalten oder den Namen der Vergleichsfunktion.
Zum Sortieren einer Feldliste muss die Zeichenkette order die Feldnamen für die Sortierung enthalten, die durch eine beliebige Anzahl von Leerzeichen, Tabulatoren oder Neue-Zeile-Zeichen getrennt sind. Jedem Feldnamen kann ein `+' oder ein `-' für auf- bzw. absteigende Sortierung vorangestellt werden. Wird dieses Zeichen weggelassen, dann wird aufsteigende Sortierung angenommen.
Zum Sortieren anhand einer Vergleichsfunktion muss die Zeichenkette order den Namen der Funktion tragen.
SETORDERSTR
liefert TRUE, wenn es möglich war, die neue Sortierung zu
setzen, anderenfalls NIL, wenn z.B. ein unbekanntes Feld angegeben wurde oder
das Typ des Feldes für die Sortierung nicht erlaubt ist. Wird NIL für
order angegeben, dann passiert nichts und es wird NIL zurückgeliefert.
Hinweis: Zum Erzeugen der Sortierzeichenkette sollten man nicht direkt den
Feldnamen in die Zeichenkette einfügen, weil bei einer Änderung des
Feldnamens der Name in der Zeichenkette nicht mit verändert wird. Besser ist
es, die Funktion FIELDNAME
(siehe FIELDNAME) zu verwenden und dessen
Ergebnis in die Sortierzeichenkette zu kopieren.
Beispiel
Man betrachte eine Tabelle `Person' mit den Feldern `Name', `Stadt' und `Geburtstag'. `(SETORDERSTR Person (SPRINTF "+%s" (FIELDNAME Person.Name)))' setzt dann die Sortierreihenfolge der Tabelle `Person' auf `Name' als (aufsteigendes) Sortierfeld.
Siehe auch GETORDERSTR, REORDER, REORDERALL, GETISSORTED, SETISSORTED, Order, Vergleichsfunktion.
16.20.4 REORDER
REORDER
bringt alle unsortierten Datensätze zurück in die richtige
Reihenfolge.
|
Untersucht alle Datensätze der gegebenen Tabelle nach unsortierten
Datensätzen und fügt diese in ihrer korrekten Position ein.
Nach dem Einfügen eines unsortierten Datensatzes wird der Sortierstatus
des Datensatzes auf TRUE gesetzt, so dass bei nach Beendigung der Funktion
REORDER
der Sortierstatus aller Datensätze auf TRUE steht.
REORDER
liefert NIL.
Normalerweise wird diese Funktion nur dann aufgerufen, wenn eine Vergleichsfunktion für die Sortierung der Tabelle definiert wurde. Sortierungen anhand einer Felderliste sind automatisch, das bedeutet, dass ein Datensatz automatisch sortiert wird, wenn er benötigt wird.
Für einen Anwendungsfall zur Anwendung dieser Funktion siehe Vergleichsfunktion.
Siehe auch REORDERALL, GETORDERSTR, SETORDERSTR, GETISSORTED, SETISSORTED, Order, Vergleichsfunktion.
16.20.5 REORDERALL
REORDERALL
sortiert alle Datensätze einer Tabelle neu.
|
Sortiert alle Datensätze der gegebenen Tabelle neu, indem der Sortierstatus
aller Datensätze auf NIL gesetzt und dann REORDER
zum kompletten
Neusortieren aufgerufen wird.
REORDERALL
liefert NIL.
Siehe auch REORDER, GETORDERSTR, SETORDERSTR, GETISSORTED, SETISSORTED, Sortieren, Vergleichsfunktion.
16.20.6 GETFILTERACTIVE
GETFILTERACTIVE
liefert den Filterstatus einer Tabelle.
|
Liefert TRUE, wenn der Filter gegebenen Tabelle momentan aktiviert ist, anderenfalls NIL.
Siehe auch SETFILTERACTIVE, GETFILTERSTR, GETMATCHFILTER.
16.20.7 SETFILTERACTIVE
SETFILTERACTIVE
setzt den Filterstatus einer Tabelle.
|
Setzt den Filterstatus der gegebenen Tabelle. Ist bool nicht NIL, dann wird er Filter aktiviert, anderenfalls deaktiviert.
SETFILTERACTIVE
liefert den neuen Status des Filters.
Der neue Status muss nicht dem erwarteten entsprechen, falls beim Aktivieren
des Filters ein Fehler auftrat und der Filter deshalb nicht aktiviert werden
konnte.
Deaktivieren des Filters gelingt jedoch immer.
Siehe auch GETFILTERACTIVE, SETFILTERSTR, SETMATCHFILTER.
16.20.8 GETFILTERSTR
GETFILTERSTR
liefert den Datensatzfilterausdruck einer Tabelle.
|
Liefert den Datensatzfilterausdruck der gegebenen Tabelle als Zeichenkette. Eine leere Zeichenkette bedeutet, dass kein Filterausdruck für diese Tabelle gesetzt wurde.
Siehe auch SETFILTERSTR, GETFILTERACTIVE, GETMATCHFILTER.
16.20.9 SETFILTERSTR
SETFILTERSTR
setzt den Datensatzfilterausdruck einer Tabelle.
|
Setzt den Datensatzfilterausdruck der gegebenen Tabelle auf den Ausdruck im Parameter filter-str (hierbei wird der Ausdruck als Zeichenkette angegeben, also nicht der Ausdruck selbst!). Ist der Filter der gegebenen Tabelle momentan aktiviert, dann wird der neue Filterausdruck sofort auf alle Datensätze angewendet und der Status der Filterübereinstimmung aller Datensätze neu berechnet.
SETFILTERSTR
liefert TRUE, wenn es möglich war, den gegebenen
Filterzeichenkettenausdruck zu kompilieren, anderenfalls wird NIL geliefert.
Man beachte, dass man nur das Ergebnis der Kompilierung erhält. Ist der Filter
der gegebenen Tabelle momentan aktiviert und das Neuberechnen aller Stati der
Filterübereinstimmungen fehlschlägt, dann wird man nicht über das Ergebnis
dieser Funktion informiert. Daher ist der empfohlene Weg, einen neuen
Filterausdruck zu setzen, folgender:
(SETFILTERACTIVE Table NIL) ; gelingt immer. (IF (NOT (SETFILTERSTR Table filter-string)) (ERROR "Kann den Filter für %s nicht setzen!" (TABLENAME Table)) ) (IF (NOT (SETFILTERACTIVE Table TRUE)) (ERROR "Kann den Filter für %s nicht aktivieren!" (TABLENAME Table)) ) |
Wird SETFILTERSTR
mit dem Wert NIL für den Parameter filter-str
aufgerufen, dann passiert nichts und NIL wird zurückgeliefert.
Beispiel: `(SETFILTERSTR Table "(> Wert 0.0)")'.
Siehe auch GETFILTERSTR, SETFILTERACTIVE, SETMATCHFILTER.
16.20.10 RECORDS
RECORDS
liefert die Anzahl der Datensätze in einer Tabelle.
|
Liefert die Anzahl der Datensätze in der gegebenen Tabelle. Man kann einen Stern zum Tabellennamen hinzufügen, um die Anzahl der Datensätze zu ermitteln, die dem Filter der Tabelle genügen.
16.20.11 RECORD
RECORD
liefert einen Datensatzzeiger für eine gegebene Datensatznummer.
|
Liefert den Datensatzzeiger des num-ten Datensatzes in der gegebenen Tabelle oder NIL, wenn ein Datensatz mit dieser Nummer nicht existiert. Man kann einen Stern zum Tabellennamen hinzufügen, um den num-ten Datensatz zu erhalten, der dem Datensatzfilter genügt.
Es ist darauf zu achten, dass Datensatznummern bei 1 beginnen und die Datensatznummer 0 für den Vorgabedatensatz verwendet wird.
16.20.12 SELECT
SELECT
ermittelt und liefert diverse Daten von Datensätzen.
|
wobei exprlist entweder ein einfacher Stern `*' oder eine Liste von durch Komma getrennten Ausdrücken mit optionalen Titeln ist:
exprlist: |
und tablelist eine Liste von Tabellennamen:
tablelist: table[ |
Für jede Tabelle in der Tabellenliste kann ein Bezeichner (Identifier) angegeben werden. Dies kann nützlich sein, wenn eine Tabelle mehr als einmal in der Tabellenliste vorkommt (siehe unten das Beispiel zum Vergleichen von Altersangaben). Wird ein Stern zum Tabellennamen hinzugefügt, dann werden nur die Datensätze der Tabelle betrachtet, die dem momentanen Filter der Tabelle genügen.
Die Sortierliste hat den folgenden Aufbau:
orderlist: expr [ |
wobei expr, ... beliebige Ausdrücke oder Feldnummern sein können.
Zum Beispiel sortiert `(SELECT Name FROM ... ORDER BY 1)'
das Ergebnis nach dem Feld `Name'.
Man kann zudem ASC
oder DESC
für eine auf- bzw. absteigende
Sortierung angeben.
Ist keiner der beiden vorhanden, dann wird aufsteigende Sortierung
angenommen.
Funktionsweise
Die SELECT-FROM-WHERE-Abfrage bildet das (mathematische) Kreuzprodukt aller Tabellen in der Tabellenliste (es wertet alle Datensatzmengen in table, ... aus) und prüft den WHERE-Ausdruck (wenn vorhanden). Liefert der WHERE-Ausdruck TRUE (oder es gibt keinen WHERE-Ausdruck), dann wird eine Liste erzeugt, dessen Elemente anhand der Ausdrucksliste im SELECT-Teil berechnet wurden. Wurde ein einzelner Stern in der Ausdrucksliste angegeben, dann enthält die Liste die Werte aller Felder, die zu den Tabellen in der Tabellenliste gehören (hiervon ausgenommen sind die virtuellen Felder und Knöpfe).
Das Ergebnis der Abfrage ist eine Liste von Listen. Der erste Listeneintrag enthält die Titelzeichenketten, die restlichen die Werte der FROM-Liste für die passenden Datensätze.
Beispiele
Siehe Abfragebeispiele
für einige Beispiele mit der Funktion SELECT
.
Siehe auch FOR ALL.
16.21 Oberflächenfunktionen
Dieser Abschnitt beschreibt die Funktionen zum Verändern von Benutzeroberflächenelementen.
16.21.1 SETCURSOR | Setzt den Cursor auf ein GUI-Element. | |
16.21.2 SETBGPEN | Setzt den Hintergrundstift eines GUI-Elements. | |
16.21.3 GETWINDOWOPEN | Holt den Geöffnet/Geschlossen-Status eines Fensters. | |
16.21.4 SETWINDOWOPEN | Öffnen/Schließen eines Fensters. | |
16.21.5 GETVIRTUALLISTACTIVE | Bestimmt die aktuelle Zeile eines virtuellen Feldes. | |
16.21.6 SETVIRTUALLISTACTIVE | Setzt die aktuelle Zeile eines virtuellen Feldes. |
16.21.1 SETCURSOR
SETCURSOR
setzt den Cursor auf ein Benutzeroberflächenelement.
|
Setzt den Cursor auf das gegebene Feld oder Benutzeroberflächenelement der Tabelle. Die Funktion öffnet auch das Fenster, in dem das Feld/die Tabelle eingebettet ist, wenn das Fenster noch geschlossen ist.
SETCURSOR
liefert TRUE, wenn kein Fehler auftrat (Fenster konnte
geöffnet werden) oder NIL bei einem Fehler.
Siehe auch SETVIRTUALLISTACTIVE.
16.21.2 SETBGPEN
SETBGPEN
setzt den Hintergrundstift eines GUI-Elements.
|
Setzt den Stift zum Zeichnen des Hintergrunds des durch field gegebenen GUI-Elements. Für pen kann eine hexadezimaler Ganzzahl, welche eine Farbe im RGB-Format (rot, grün, blau) spezifiziert, oder eine der PEN_*-Konstanten verwendet werden. Ist pen NIL dann wird ein Standardhintergrund gesetzt.
SETBGPEN
gibt den Wert des neuen Hintergrundstiftes zurück.
Beispiel: `(SETBGPEN Control.Status 0xFF0000)' setzt einen roten Hintergrund für das GUI-Element des Feldes `Status' in der Tabelle `Table'. Der selbe Effekt kann durch Verwenden von `(SETBGPEN Control.Status PEN_RED)' erreicht werden.
Siehe auch Pre-defined constants.
16.21.3 GETWINDOWOPEN
GETWINDOWOPEN
liefert den Geöffnet-Status eines Fensters.
|
Liefert den Geöffnet-Status des Fensters, in dem das Feld bzw. die Tabelle eingebettet ist.
Siehe auch SETWINDOWOPEN.
16.21.4 SETWINDOWOPEN
SETWINDOWOPEN
öffnet und schließt ein Fenster.
|
Öffnet oder schließt das Fenster, in dem das gegebenen Feld bzw. die gegebenen Tabelle eingebettet ist. ist open nicht NIL, dann wird das Fenster geöffnet, anderenfalls wird es geschlossen. Das Hauptfenster eines Projekts kann nicht geschlossen werden.
SETWINDOWOPEN
liefert den neuen Geöffnet-Status des Fensters.
Siehe auch GETWINDOWOPEN.
16.21.5 GETVIRTUALLISTACTIVE
GETVIRTUALLISTACTIVE
liefert den Index der aktiven Zeile
eines virtuellen Feldes, welches für die Anzeige die `Listen'-Art
verwendet.
|
Liefert den logischen Index (beginnend mit 1) der gerade aktuellen Zeile des gegebenen virtuellen Feldes. Der logische Index ist die Zeile in der ursprünglichen Liste, die beim Setzen des virtuellen Feldes verwendet wurde. Diese kann von der angezeigten Ordnung abweichen, falls der Benuzter die Liste umsortiert hat, z.B. durch Klicken auf einen Spaltentitel. Falls das Bedienelement von virtual-field nicht sichtbar ist oder nicht die `Listen'-Art für die Anzeige verwendet oder falls keine Zeile aktiv ist, so wird NIL zurückgegeben.
Siehe auch SETVIRTUALLISTACTIVE.
16.21.6 SETVIRTUALLISTACTIVE
SETVIRTUALLISTACTIVE
setzt die aktive Zeile eines virtuellen Feldes,
welche die `Listen'-Art für die Anzeige verwendet.
|
Setzt die aktive Zeile des gegebenen virtuellen Feldes auf die num-te logische Zeile (beginned mit 1). Der logische Zeile ist die Zeile in der ursprünglichen Liste, die beim Setzen des virtuellen Feldes verwendet wurde, und kann von der angezeigten Ordnung abweichen, falls der Benuzter die Liste umsortiert hat, z.B. durch Klicken auf einen Spaltentitel.
Liefert num oder NIL, falls das Bedienelement von virtual-field nicht sichtbar ist oder nicht die `Listen'-Art für die Anzeige verwendet oder falls num außerhalb des gültigen Bereiches ist (kleiner als 1 oder größer der Anzahl Zeilen).
SETVIRTUALLISTACTIVE
setzt nicht den Cursor auf das Benutzerelement des
Feldes. Dies kann mit SETCURSOR
(siehe SETCURSOR) erreicht werden.
Siehe auch GETVIRTUALLISTACTIVE, SETCURSOR.
16.22 Projektfunktionen
Dieser Abschnitt listet Funktionen auf, die mit Projekten zu tun haben.
16.22.1 PROJECTNAME | Holt den Projektnamen. | |
16.22.2 PREPARECHANGE | Bereitet das Projekt für eine Änderung vor. | |
16.22.3 CHANGES | Holt die Anzahl bisher gemachter Änderungen. | |
16.22.4 GETADMINMODE | Prüfen ob in Admin- oder Benutzermodus. | |
16.22.5 SETADMINMODE | Setzen des Admin- oder Benutzermodus. | |
16.22.6 ADMINPASSWORD | SHA1-Hash des Admin-Passworts. |
16.22.1 PROJECTNAME
PROJECTNAME
liefert den Projektnamen.
|
PROJECTNAME
liefert den Namen des aktuellen Projekts als
Zeichenkette oder NIL, wenn noch kein Name definiert wurde.
Der Projektname ist der Pfadname des Projektverzeichnisses im Dateisystem.
Siehe auch CHANGES.
16.22.2 PREPARECHANGE
PREPARECHANGE
bereitet das Projekt für eine Änderung vor.
|
Dieser Befehl erwirbt einen Änderungszugriff auf das Projekt. Dies ist nützlich, wenn auf ein Projekt mit mehreren BeeBase-Instanzen zugegriffen wird, welche möglicherweise auf verschiedenen Rechnern laufen. Wurde ein Änderungszugriff erteilt, so kann keine andere BeeBase-Instanz diesen ebenfalls erhalten, bis der Zugriff wieder freigegeben wird. Der Änderungszugriff wird freigegeben, wenn das Projektprogramm endet ohne tatsächlich eine Änderung vorzunehmen, oder wenn das Projekt gespeichert wird. Für weitere Informationen über den geteilten Zugriff auf ein Projekt, siehe Dateiformat.
Bei Erfolg liefert PREPARECHANGE
NIL zurück.
Schlägt der Erwerb des Änderungszugriffs fehl, so wird das Programm beendet
und eine entsprechende Fehlermeldung generiert.
Siehe auch CHANGES.
16.22.3 CHANGES
CHANGES
liefert die Anzahl der bisher gemachten Änderungen am
aktuellen Projekt.
|
Liefert eine Ganzzahl mit der Anzahl der Änderungen seit der letzten Speicherung des aktuellen Projekts.
Siehe auch PREPARECHANGE, PROJECTNAME.
16.22.4 GETADMINMODE
GETADMINMODE
gibt an,
ob sich das aktuelle Projekt im Admin- oder Benutzermodus befindet.
|
Liefert TRUE, falls sich das aktuelle Projekt im Admin-Modus befindet, NIL andernfalls.
Siehe auch SETADMINMODE, ADMINPASSWORD, onAdminMode.
16.22.5 SETADMINMODE
SETADMINMODE
versetzt das aktuelle Projekt
in den Admin- oder Benutzermodus.
|
Ist admin NIL, so wird das aktuelle Projekt in den Benutzermodus, andernfalls in den Admin-Modus versetzt. Zu bemerken ist, dass keine Passwortabfrage stattfindet, wenn ein Projekt über diese Funktion vom Benutzer- in der Admin-Modus versetzt wird.
Liefert TRUE, falls das Projekt in den Admin-Modus versetzt wurde, oder NIL falls es in den Benutzermodus versetzt wurde.
Siehe auch GETADMINMODE, ADMINPASSWORD, onAdminMode, Beispielprojekt `Users.bbs'.
16.22.6 ADMINPASSWORD
ADMINPASSWORD
liefert das Admin-Passwort als SHA1-Hash.
|
Liefert eine Zeichenkette, welche den SHA1-Hash des Admin-Passworts des aktuellen Projekts enthält. Wurde kein Admin-Passwort gesetzt, so wird NIL zurückgegeben.
Siehe auch GETADMINMODE, SETADMINMODE, SHA1SUM, Beispielprojekt `Users.bbs'.
16.23 Systemfunktionen
Dieser Abschnitt listet Funktionen auf, die auf das Betriebssystem zugreifen.
16.23.1 EDIT | Startet externen Editor und wartet. | |
16.23.2 EDIT* | Startet externen Editor asynchron. | |
16.23.3 VIEW | Startet externen Anzeiger und wartet. | |
16.23.4 VIEW* | Startet externen Anzeiger asynchron. | |
16.23.5 SYSTEM | Führt externe Befehle aus und wartet. | |
16.23.6 SYSTEM* | Führt externe Befehle asynchron aus. | |
16.23.7 STAT | Untersucht eine Datei. | |
16.23.8 TACKON | Erzeugt einen Pfadnamen aus Komponenten. | |
16.23.9 FILENAME | Ermittelt die letzte Komponente eines Pfades. | |
16.23.10 DIRNAME | Ermittelt das Verzeichnis von einem Pfad. | |
16.23.11 MESSAGE | Gibt Meldungen aus. | |
16.23.12 COMPLETEMAX | Setzen der max. Anzahl der Fortschrittsanzeige. | |
16.23.13 COMPLETEADD | Erhöhen der Fortschrittsanzeige. | |
16.23.14 COMPLETE | Direktes Setzten der Fortschrittsanzeige. | |
16.23.15 GC | Erzwingt das Aufräumen des Speichers. | |
16.23.16 PUBSCREEN | Name des Public-Screens (Amiga). |
16.23.1 EDIT
EDIT
startet den externen Editor.
|
Startet den externen Editor zum Bearbeiten der gegebenen Datei.
Der externen Editor kann unter dem Menüpunkt `Einstellungen - Externen
Editor setzen' (siehe Externer Editor)
eingestellt werden.
EDIT
startet den externen Editor synchron, das bedeutet,
die Funktion wartet bis der Benutzer den Editor beendet hat.
EDIT
gibt den Rückgabewert des externen Editors als Ganzzahl zurück.
Siehe auch EDIT*, VIEW, SYSTEM.
16.23.2 EDIT*
EDIT*
ist die Stern-Version von EDIT
und hat den selben
Effekt wie EDIT
(siehe EDIT).
Der einzige Unterschied ist, dass EDIT*
den externen Editor asynchron
startet und sofort wieder zurückkehrt.
EDIT*
liefert 0, wenn der Editor erfolgreich gestartet werden konnte,
anderenfalls wird eine Ganzzahl ungleich 0 zurückgegeben, welche einen
system-abhängigen Fehler beschreibt.
Siehe auch EDIT, VIEW*, SYSTEM*.
16.23.3 VIEW
VIEW
startet den externen Anzeiger.
|
Startet den externen Anzeiger zum Anzeigen der gegebenen Datei.
Der externen Anzeiger kann unter dem Menüpunkt `Einstellungen - Externen
Anzeiger setzen' (siehe Externer Anzeiger)
eingestellt werden.
VIEW
startet den externen Anzeiger synchron, das bedeutet,
die Funktion wartet bis der Benutzer den Anzeiger beendet hat.
Zu beachten ist aber, dass auf manchen Systemen sofort
zurückgekehrt wird, falls bereits eine Instanz des Anzeigers gestartet wurde.
VIEW
gibt den Rückgabewert des externen Anzeigers als Ganzzahl zurück.
Siehe auch VIEW*, EDIT, SYSTEM.
16.23.4 VIEW*
VIEW*
ist die Stern-Version von VIEW
und hat den selben
Effekt wie VIEW
(siehe VIEW).
Der einzige Unterschied ist, dass VIEW*
den externen Anzeiger asynchron
startet und sofort wieder zurückkehrt.
VIEW*
liefert 0, wenn der Anzeiger erfolgreich gestartet werden konnte,
anderenfalls wird eine Ganzzahl ungleich 0 zurückgegeben, welche einen
system-abhängigen Fehler beschreibt.
Siehe auch VIEW, EDIT*, SYSTEM*.
16.23.5 SYSTEM
SYSTEM
ruft ein externes Programm auf.
|
Ruft ein externes Programm auf. Die Befehlszeile zum Programmaufruf wird aus
fmt und den optionalen Parametern wie in der Funktion SPRINTF
(siehe SPRINTF) erzeugt.
Die Befehlszeile wird mit einem Kommandozeilen-Interpreter ausgeführt
(ShellExecute auf Windows, /bin/sh auf Mac OS und Linux, User-Shell auf Amiga).
SYSTEM
wartet, bis das aufgerufene Programm beendet wurde.
SYSTEM
gibt den Rückgabewert des ausgeführten Befehls
als Ganzzahl zurück.
Siehe auch EDIT, VIEW, SYSTEM*.
16.23.6 SYSTEM*
SYSTEM*
ist die Stern-Version von SYSTEM
und hat den selben
Effekt wie SYSTEM
(siehe SYSTEM).
Der einzige Unterschied ist, dass SYSTEM*
die Befehlszeile asynchron
ausführt und sofort wieder zurückkehrt.
SYSTEM*
liefert 0, wenn das Ausführen der Befehlszeile erfolgreich
gestartet werden konnte,
anderenfalls wird eine Ganzzahl ungleich 0 zurückgegeben, welche einen
system-abhängigen Fehler beschreibt.
Siehe auch SYSTEM, EDIT*, VIEW*.
16.23.7 STAT
STAT
untersucht eine Datei.
|
Untersucht, ob der angegebene Dateiname im Dateisystem existiert.
STAT
liefert NIL, wenn der Dateiname nicht gefunden werden konnte;
0, wenn der Dateiname existiert und ein Verzeichnis ist,
und eine Ganzzahl größer 0, wenn der Dateiname existiert
und eine gültige Datei ist.
16.23.8 TACKON
TACKON
erzeugt einen Pfadnamen.
|
Verknüpft dirname und alle Komponenten in [component ...]
zu einem Pfadnamen.
TACKON
weiß, wie es mit speziellen Zeichen,
die als Pfadseparator dienen, am Ende jedes Arguments umzugehen hat.
Es liefert den Pfadnamen als Zeichekette oder NIL, falls eines der
Argumente NIL ist.
Zu beachten ist, dass TACKON
nicht untersucht,
ob der resultierende Pfad auch tatsächlich zu einer Datei oder
einem Verzeichnis im Dateisystem gehört.
Beispiel: `(TACKON "Sys:System" "CLI")' liefert "Sys:System/CLI".
16.23.9 FILENAME
FILENAME
extrahiert den Dateinamen aus einem Pfadnamen.
|
Extrahiert die letzte Komponente eines gegebenen Pfadnamens.
Es wird nicht geprüft, ob die letzte Komponente momentan auf
eine Datei verweist, so dass es auch möglich ist, FILENAME
zu verwenden, um den Namen eines Unterverzeichnisses zu erhalten.
FILENAME
liefert sein Ergebnis als Zeichenkette oder NIL,
wenn path NIL ist.
Beispiel: `(FILENAME "Sys:System/CLI")' liefert "CLI".
16.23.10 DIRNAME
DIRNAME
extrahiert den Verzeichnis-Teil eines Pfadnamens.
|
Extrahiert den Verzeichnis-Teil des gegebenen Pfadnamens.
Es wird nicht geprüft, ob path momentan auf eine Datei
verweist, so dass es auch möglich ist, DIRNAME
zu verwenden,
um den Namen eines übergeordneten Verzeichnisses zu erhalten.
DIRNAME
liefert sein Ergebnis als Zeichenkette oder NIL,
wenn path NIL ist.
Beispiel: `(DIRNAME "Sys:System/CLI")' liefert "Sys:System".
16.23.11 MESSAGE
MESSAGE
gibt eine Meldung für den Benutzer aus.
|
Setzt den Fenstertitel des Pause/Abbrechen-Fensters (wenn es geöffnet ist).
Die Titelzeichenkette wird aus fmt und den optionalen Parametern wie in
der Funktion SPRINTF
(siehe SPRINTF) erzeugt.
MESSAGE
liefert die formatierte Titelzeichenkette.
Beispiel: `(MESSAGE "6 * 7 = %i" (* 6 7))'.
16.23.12 COMPLETEMAX
COMPLETEMAX
setzt die maximale Anzahl Schritte der Fortschrittsanzeige.
|
Setzt die maximale Anzahl Schritte für die Anzeige des Fortschritts eines BeeBase-Programms. Voreingestellt sind 100 Schritte (falls diese Funktion nicht aufgerufen wird). Das Argument steps muss eine Ganzzahl sein. Ist steps NIL oder 0 so wird keine Fortschrittsleiste angezeigt. Die Fortschrittsleiste ist Teil des Pause/Abbrechen-Fensters, welches bei Ausführen eines BeeBase-Programms nach einer kurzen Verzögerung erscheint.
COMPLETEMAX
gibt das Argument steps zurück.
Siehe auch COMPLETEADD, COMPLETE.
16.23.13 COMPLETEADD
COMPLETEADD
erhöht die Fortschrittsanzeige.
|
Addiert die Ganzzahl add auf den aktuellen Fortschrittswert. Zu Anfang ist der Fortschrittswert 0. Ist add NIL, so wird der Fortschrittswert auf 0 zurückgesetzt und die Fortschrittsanzeige unterdrückt.
COMPLETEADD
gibt das Argument add zurück.
Beispiel:
(SETQ num ...) (COMPLETEMAX num) (DOTIMES (i num) (COMPLETEADD 1) ) |
Siehe auch COMPLETEMAX, COMPLETE.
16.23.14 COMPLETE
COMPLETE
setzt die Fortschrittsanzeige.
|
Setzt den aktuellen Fortschrittswert auf die Ganzzahl cur. Ist cur NIL oder 0, so wird keine Fortschrittsleiste angezeigt.
COMPLETE
gibt das Argument cur zurück.
Beispiel:
(COMPLETE 10) ... (COMPLETE 50) ... (COMPLETE 100) |
Siehe auch COMPLETEMAX, COMPLETEADD.
16.23.15 GC
GC
erzwingt das Aufräumen des Speichers.
|
Erzwingt das Aufräumen des Speichers und liefert NIL. Im Normalfall wird das Aufräumen automatisch von Zeit zu Zeit durchgeführt.
16.23.16 PUBSCREEN
PUBSCREEN
liefert den Namen des Public-Screens.
|
Auf dem Amiga gibt PUBSCREEN
den Namen des Public-Screens,
auf dem BeeBase läuft, zurück oder NIL, falls der Screen nicht öffentlich ist.
Auf anderen Systemen liefert PUBSCREEN
NIL zurück.
16.24 Vordefinierte Variablen
BeeBase kennt einige vordefinierte globale Variablen.
Momentan existiert nur eine einzige globale Variable: stdout
(siehe stdout).
16.25 Vordefinierte Konstanten
Die folgenden vordefinierten Konstanten können in jedem Ausdruck bei der Programmierung verwendet werden:
Name Typ Wert Bemerkung
-------------------------------------------------------------------------
|
Siehe Konstanten für weitere Informationen
über Konstanten.
Zum Definieren eigener Konstanten benutzt man die Preprozessor-Anweisung
#define
(siehe #define).
16.26 Funktionale Parameter
Es ist möglich, eine Funktion als einen Parameter an eine andere Funktion zu übergeben. Dies ist nützlich für die Definition von übergeordneten Funktionen, wie z.B. zum Sortieren oder Abbilden einer Liste.
Um eine Funktion auzurufen, die als Parameter übergeben wurde, muss die
Funktion FUNCALL
(siehe FUNCALL) verwendet werden.
Beispiel:
(DEFUN map (l fun) # Parameter: Liste und Funktion (LET (res) # lokale Variable res, vorbelegt mit NIL (DOLIST (i l) # jedes Element der Reihe nach (SETQ res (CONS (FUNCALL fun i) res) # Funktion aufrufen und ) # neue Liste erzeugen ) (REVERSE res) # die Liste muss nun umgekehrt werden ) ) |
Jetzt kann diese Abbildefunktion zum Beispiel verwendet werden, um alle Elemente einer Liste mit Ganzzahlen um 1 zu erhöhen:
`(map (LIST 1 2 3 4) 1+)' liefert ( 2 3 4 5 ).
Siehe auch FUNCALL, APPLY, MAPFIRST.
16.27 Typdeklarierer
Es ist möglich, den Typ einer Variable durch Anfügen eines Typdeklarierers hinter dem Namen festzulegen. Die folgenden Typdeklarierer existieren:
Deklarierer Beschreibung
:INT für Ganzzahlen
:REAL für Fließkommazahlen
:STR für Zeichenketten
:MEMO für mehrzeilige Zeichenketten
:DATE für Datumswerte
:TIME für Zeitwerte
:LIST für Listen
:FILE für Dateihandler
:FUNC für Funktionen jedes Typs
:table für Datensatzzeiger auf table
|
Der Typdeklarierer wird an den Variablennamen wie im folgenden Beispiel angehängt:
(LET (x:INT (y:REAL 0.0) z) ...) |
Das Beispiel definiert drei neue Variablen `x', `y' und `z', wobei `x' vom Typ Ganzzahl ist und mit NIL vorbelegt wird, `y' vom Typ Fließkommazahl ist und mit 0.0 vorbelegt wird, und `z' eine Variable ohne Typ ist, die mit NIL vorbelegt wird.
Der Vorteil von Typspezifizierern ist, dass der Compiler mehr Typfehler entdecken kann, z.B. wenn eine Funktion
(DEFUN foo (x:INT) ...) |
definiert ist und sie mit `(foo "bar")' aufgerufen wird, dann erzeugt der Compiler eine Fehlermeldung. Wird `foo' jedoch mit einem Wert ohne Typ aufgerufen, z.B. `(foo (FIRST list))', dann kann keine Fehlerprüfung durchgeführt werden, da zum Zeitpunkt des Kompilierens der Typ von `(FIRST list)' nicht bekannt ist.
Aus Geschwindigkeitsgründen wird beim Programmlauf keine Typüberprüfung durchgeführt. Es könnte eingebaut werden, aber dies würde eine kleine Verlangsamung bewirken, die nicht wirklich notwendig ist, da ein falscher Typ früher oder später in einem Typfehler endet.
Typdeklarierer für Datensatzzeiger haben eine andere nützliche Eigenschaft. Wird eine Variable als Datensatzzeiger auf eine Tabelle belegt, dann kann auf alle Felder dieser Tabelle mit dem Variablennamen statt des Tabellennamens im Feldpfad zugegriffen werden. Hat man z.B. eine Tabelle `Foo' mit einem Feld `Bar' und man definiert eine Variable `foo' als
(LET (foo:Foo)) |
dann kann man das Feld `Bar' des dritten Datensatzes mit
(SETQ foo (RECORD Foo 3)) (PRINT foo.Bar) |
ausgeben.
Zu beachten ist in Select-from-where Ausdrücken, dass die Variablen in der FROM-Liste automatisch vom Typ des Datensatzzeigers des zugeordneten Tabelle sind.
16.28 Aufbau von Ausdrücken
Der Aufbau von Ausdrücken ist von sehr großer Bedeutung, um zu verstehen, was ein Programm tut.
Dieser Abschnitt bescheibt die Semantik, abhängig vom Aufbau der Ausdrücke:
(
func [expr ...])
Errechnet expr ... und ruft dann die Funktion func (Aufruf mit Wert) auf. Liefert den Rückgabewert der aufgerufenen Funktion. In BeeBase gibt es einige nicht-strikte Funktionen, z.B.
AND
,OR
undIF
. Diese Funktionen müssen nicht zwingend alle Ausdrücke errechnen. Mehr zu nicht-strikten Funktionen, siehe Lisp-Aufbau, AND, OR, and IF.(
[expr ...])
Errechnet expr ... und liefert den Wert des letzten Ausdrucks (siehe PROGN). Ein leerer Ausdruck
()
wird zu NIL.- Table
Liefert den Programmdatensatzzeiter der gegebenen Tabelle.
- Table*
Liefert den Datensatzzeiger der Benutzeroberfläche von der gegebenen Tabelle.
- FieldPath
Liefert den Inhalt des gegebenen Feldes. Der Feldpfad legt fest, welcher Datensatz verwendet wird, aus dem der Feldinhalt geholt wird. Zum Beispiel benutzt `Table.Field' den Programmdatensatzzeiger von `Table', um den Wert des Feldes zu ermitteln; `Table.ReferenceField.Field' verwendet den Programmdatensatzzeiger von `Table', um den Wert des Beziehungsfeldes zu ermitteln (der ein Datensatzzeiger ist) und verwendet diesen Datensatz, um den Wert von `Field' zu erhalten.
- var
Liefert den Inhalt der globalen oder lokalen Variable var. Globale Variablen können durch
DEFVAR
(siehe DEFVAR), lokale Variablen z.B. durchLET
(siehe LET) definiert werden.- var.FieldPath
Verwendet den Datensatzzeiger von var, um den Wert des gegebenen Feldes zu ermitteln.
16.29 Auslösefunktionen
Zum automatischen Ausführen von BeeBase-Programmen können Auslösefunktionen für Projekte, Tabellen und Felder festgelegt werden, wie in bestimmten Fällen aufgerufen werden. Dieser Abschnitt bescheibt alle vorhandenen Auslösemöglichkeiten.
16.29.1 onOpen | Auslösefunktion nach dem Öffnen eines Projekts. | |
16.29.2 onReload | Auslösefunktion nach dem Neuladen eines Projekts. | |
16.29.3 onClose | Auslösefunktion beim Schließen eines Projekts. | |
16.29.4 onAdminMode | Auslösefunktion beim Eintreten/Verlassen des Admin-Modus. | |
16.29.5 onChange | Auslösefunktion beim Verändern des Projekts. | |
16.29.6 logLabel | Berechnung der Beschriftung neuer Logeinträge. | |
16.29.7 mainWindowTitle | Berechnung des Titels des Hauptfensters. | |
16.29.8 Auslösefunktion Neu | Auslösefunktion beim Anlegen eines neuen Datensatzes. | |
16.29.9 Auslösefunktion Löschen | Auslösefunktion beim Löschen eines Datensatzes. | |
16.29.10 Vergleichsfunktion | Zum Vergleichen von Datensätzen einer Tabelle. | |
16.29.11 Auslösefunktion Feld | Auslösefunktion beim Verändern eines Feldes. | |
16.29.12 Virtuelle Felder | Wie Funktionen für virtuelle Felder geschrieben werden. | |
16.29.13 Berechne-Aktiv-Funktion | Berechnung des Aktiv-Zustands von Objekten. | |
16.29.14 Berechne Datensatzbeschreibung | Berechnung einer Datensatzbeschreibung. | |
16.29.15 Auslösefunktion Doppelklick | Auslösefunktion bei Doppelklick in einer virtuellen Liste. | |
16.29.16 Auslösefunktion URL-Drop | Auslösefunktion für URL-Drop in einer virtuellen Liste. | |
16.29.17 Auslösefunktion Sortieren-Drop | Auslösefunktion für Sortieren-Drop in einer virtuellen Liste. | |
16.29.18 Berechne Listenansicht-Auswahltexte | Auslösefuncktion bei Drücken eines Listenansicht-Popups. | |
16.29.19 Berechne Referenz-Datensätze | Auslösefuncktion bei Drücken eines Referenzen-Popups. |
16.29.1 onOpen
Nach dem Öffnen eines Projekts durchsucht BeeBase das Programm des Projekts
nach einer Funktion mit dem Namen onOpen
.
Existiert eine solche Funktion, dann wird diese ohne Parameter aufgerufen.
Beispiel
(DEFUN onOpen () (ASKBUTTON NIL "Danke für das Öffnen!" NIL NIL) ) |
Siehe auch onReload, onClose, onAdminMode, onChange, Beispielprojekt `Trigger.bbs'.
16.29.2 onReload
Ähnlich zu onOpen
ruft BeeBase die Funktion onReload
auf,
wenn das Projekt neu geladen wird, z.B. durch Auswahl des Menüpunkts
`Projekt - Neu laden'.
Die Funktion wird ohne Argumente aufgerufen.
Die Funktion onReload
wird allerdings nur dann aufgerufen,
wenn keine strukturellen Änderungen am Projekt vorliegen, d.h. keine Tabellen
oder Felder wurden geändert, hinzugefügt, oder gelöscht,
das Projektprogramm wurde nicht verändert und auch keine anderen Änderungen
an der Projektstruktur wurden vorgenommen.
In solch einem Falle wird ein Neuladen des Projekts als eine neue Öffnung
des Projekts betrachtet und die Funktion onOpen
aufgerufen.
Siehe auch onOpen, onClose, onAdminMode, onChange.
16.29.3 onClose
Bevor ein Projekt geschlossen wird, durchsucht BeeBase das Programm des
Projekts nach einer Funktion mit dem Namen onClose
.
Existiert eine solche Funktion, dann wird diese ohne Parameter aufgerufen.
In der jetzigen Version wird der Rückgabewert der Funktion ignoriert und das
Projekt unabhängig vom Rückgabewert geschlossen.
Wurden in der Funktion onClose
Änderungen am Projekt durchgeführt,
dann fragt BeeBase nach, ob das Projekt zuerst gespeichert werden soll, bevor
das Projekt geschlossen wird. Wird der Menüpunkt `Projekt - Speichern &
Schließen' zum Schließen des Projekts aufgerufen, dann wird die
Auslösefunktion aufgerufen, bevor das Projekt gespeichert wird, so dass die
Änderungen automatisch gespeichert werden.
Beispiel
(DEFUN onClose () (ASKBUTTON NIL "Auf Wiedersehen!" NIL NIL) ) |
Siehe auch onOpen, onChange, Beispielprojekt `Trigger.bbs'.
16.29.4 onAdminMode
Wird ein Projekt in den Admin- uder Benutzermodus versetzt
und eine Funktion mit dem Namen onAdminMode
existiert im Projektprogramm,
so wird diese Funktion aufgerufen.
Die Funktion erhält ein Argument admin, welches angibt,
ob sich das aktuelle Projekt im Admin- (admin ist nicht NIL)
oder Benutzermods (admin ist NIL) befindet.
Beispiel
(DEFUN onAdminMode (admin) (IF admin (ASKBUTTON NIL "Im Admin-Modus" NIL NIL) (ASKBUTTON NIL "Im Benutzermodus" NIL NIL) ) ) |
Siehe auch onOpen, onChange, SETADMINMODE, Beispielprojekt `Users.bbs'.
16.29.5 onChange
Wann immer der Benutzer eine Änderung am Projekt durchführt oder nach dem
Speichern eines Projekts, durchsucht BeeBase das Programm des Projekts nach
einer Funktion mit dem Namen onChange
.
Existiert eine solche Funktion, dann wird diese ohne Parameter aufgerufen.
Dies kann verwendet werden, um die Anzahl der Änderungen zu erfassen, die ein
Benutzer an diesem Projekt durchgeführt hat.
Beispiel
(DEFUN onChange () (SETQ Control.NumChanges (CHANGES)) ) |
Im obigen Beispiel könnte `Control.NumChanges' ein virtuelles Feld sein, das in einer `Nur-ein-Datensatz'-Tabelle zum Anzeigen der Anzahl von Projektänderungen verwendet wird.
Siehe auch onOpen, onClose, onAdminMode, logLabel, Beispielprojekt `Trigger.bbs'.
16.29.6 logLabel
Beim Erstellen eines neuen Logeintrags sucht BeeBase im Programm des Projekts
nach einer Funktion mit dem Namen logLabel
.
Ist diese vorhanden, so wird sie ohne Argumente aufgerufen.
Der zurückgegebene Wert wird in eine Zeichenkette umgewandelt und für das
`_Label'-Feld des neuen Logeintrags verwendet
(siehe Logbeschriftung setzen).
Beispiel
(DEFUN logLabel () Control.CurrentUser.Name ) |
Das obige Beispiel wurde dem Projekt `Users.bbs' entnommen. Hier wird die Beschriftung auf den Namen des aktuellen Benutzers gesetzt. Dies bedeutet, dass alle Änderungen des aktuellen Benutzers mit seinem oder ihrem Namen beschriftet werden. Dadurch ist es später möglich, zu identifizieren, welcher Benutzer welche Änderungen vorgenommen hat.
Siehe auch onChange, Beispielprojekt `Users.bbs'.
16.29.7 mainWindowTitle
Enthält das Programm eines Projekts eine Funktion mit dem Namen
mainWindowTitle
, so wird das Resultat dieser Funktion zum Setzten
des Fenstertitels des Projekt-Hauptfensters verwendet.
Die Funktion wird ohne Argumente aufgerufen
und muss eine Zeichenkette zurückliefern.
Der Fenstertitel wird automatisch neuberechnet, sobald ein in der Funktion
verwendetes Feld seinen Wert ändert.
Falls mainWindowTitle
nicht vorhanden ist,
so zeigt der Fenstertitel den Namen des Projekts an.
In jedem Fall markiert BeeBase ein Projekt, welches nicht gespeicherte Änderungen enthält, mit einem vorgestellten `*'-Zeichen im Fenstertitel.
Siehe auch Beispielprojekt `Trigger.bbs'.
16.29.8 Auslösefunktion Neu
Sobald der Benutzer einen neuen Datensatz durch Auswählen der Menüpunkte `Neuer Datensatz' oder `Datensatz kopieren' anlegen möchte und die Auslösefunktion `Neu' für diese Tabelle auf eine BeeBase-Funktion gesetzt wurde, dann wird diese Auslösefunktion ausgeführt. Die Auslösefunktion für `Neu' kann im Tabellenfenster (siehe Tabellen erstellen) gesetzt werden.
Die Auslösefunktion erhält NIL oder einen Datensatzzeiger als ersten und
einzigen Parameter. NIL bedeutet, dass der Benutzer einen neuen Datensatz
anlegen möchte und ein Datensatzzeiger zeigt an, dass der Benutzer einen
Datensatz eine Kopie dieses Datensatzes anlegen will. Hat die Auslösefunktion
mehr als einen Parameter, dann werden diese mit NIL vorbelegt. Die
Auslösefunktion sollte nun einen neuen Datensatz mit NEW
(siehe NEW)
anlegen. Der Rückgabewert der Auslösefunktion wird ausgewertet. Ist er ein
Datensatzzeiger, dann wird dieser Datensatz angezeigt.
Die Auslösefunktion `Neu' wird auch aufgerufen, wenn ein
BeeBase-Programm die Funktion NEW*
(siehe NEW*) aufruft.
Beispiel einer Auslösefunktion Neu
(DEFUN newRecord (init) (PROG1 ; zum Rückgeben des Ergebnisses von NEW (NEW Table init) ... ) ) |
Siehe auch NEW, NEW*, Auslösefunktion Löschen.
16.29.9 Auslösefunktion Löschen
Sobald der Benutzer einen Datensatz durch Auswählen des Menüpunkts `Datensatz löschen' löschen möchte und die Auslösefunktion `Löschen' für diese Tabelle auf eine BeeBase-Funktion gesetzt wurde, dann wird diese Auslösefunktion ausgeführt. Die Auslösefunktion für `Löschen' kann im Tabellenfenster (siehe Tabellen erstellen) gesetzt werden.
Die Auslösefunktion erhält einen Booleschen Parameter als einzigen Parameter.
Ist er nicht NIL, dann sollte die Funktion nachfragen, ob der Benutzer
wirklich diesen Datensatz löschen möchte. Wenn er es möchte, dann sollte die
Funktion DELETE
(siehe DELETE) zum Löschen des Datensatzes aufrufen.
Die Auslösefunktion `Delete' wird auch aufgerufen, wenn ein
BeeBase-Programm die Funktion DELETE*
(siehe DELETE*) aufruft.
Beispiel einer Auslösefunktion Löschen
(DEFUN deleteRecord (confirm) (DELETE Table confirm) ) |
Siehe auch DELETE, DELETE*, Auslösefunktion Neu.
16.29.10 Vergleichsfunktion
Um eine Sortierung von Datensätzen einer Tabelle zu definieren, kann eine Vergleichsfunktion verwendet werden. Siehe Sortierung ändern, für Informationen wie eine solche Funktion für eine Tabelle spezifiziert werden kann. Die Vergleichsfunktion erhält zwei Datensatzzeiger als Argumente und liefert eine Ganzzahl zurück, die das Sortierverhältnis der beiden Datensätze anzeigt. Die Vergleichsfunktion sollte einen Wert kleiner 0 liefern, wenn ihr erstes Argument kleiner ist als das zweite; 0, wenn sie gleich sind und einen Wert größer 0, wenn das erste Argument größer ist als das zweite.
Angenommen, man hat eine Tabelle `Persons' mit dem Zeichenkettenfeld `Name', dann könnte man folgende Funktion zum Vergleich zweier Datensätze verwenden:
(DEFUN cmpPersons (rec1:Persons rec2:Persons) (CMP rec1.Name rec2.Name) ) |
Dies wird alle Datensätze bezüglich dem Feld `Name' sortieren, wobei Zeichengrößen unterschieden werden. Anzumerken ist, dass Sortieren anhand einer Felderliste nicht das gleiche Ergebnis liefert, da der Zeichenkettenvergleich zeichengrößenunabhängig durchgeführt wird.
Mit einer Vergleichsfunktion lassen sich sehr komplexe Sortierungen definieren. Man achte jedoch darauf, keine rekursiven Funktionsaufrufe zu erzeugen, die sich selbst aufrufen. BeeBase wird seine Programmausführung anhalten und dies mit einer Fehlermeldung quittieren, sollte so etwas versucht werden. Auch sollten keine Befehle verwendet werden, die Seiteneffekte erzeugen könnten, wie z.B. einen Wert einem Feld zuweisen.
Wird eine Vergleichsfunktion verwendet, dann weiß BeeBase nicht immer, wann es die Datensätze neu zu sortieren hat. Nehmen wir im obigen Beispiel zusätzlich an, dass es die Tabelle `Toys' mit dem Zeichenkettenfeld `Name' und das Beziehungsfeld `Owner' gibt, das auf `Persons' verweist. Zudem nehmen wir folgende Vergleichsfunktion an:
(DEFUN cmpToys (rec1:Toys rec2:Toys) (CMP* rec1.Owner rec2.Owner) ) |
Diese Funktion verwendet die Sortierung von `Persons', um die Sortierung der Datensätze festzustellen, so dass die Datensätze von `Toys' analog der Sortierung von `Persons' sortiert sind.
Ändert nun der Benutzer einen Datensatz in der Tabelle `Persons' und dieser Datensatz erhält eine neue Position, dann müssten auch Datensätze in `Toys' neu sortiert werden, die auf diesen Datensatz verweisen. BeeBase kennt jedoch diese Abhängigkeit nicht.
Neben der Verwendung des Menüpunktes `Tabelle - Alle Datensätze neu sortieren' auf die Tabelle `Toys' zum Neusortieren kann auch ein automatisches Neusortieren implementiert werden, indem folgende Auslösefunktion für das Feld `Name' der Tabelle `Persons' festgelegt wird:
(DEFUN setName (newValue) (SETQ Persons.Name newValue) (FOR ALL Toys WHERE (= Toys.Owner Persons) DO (SETISSORTED Toys NIL) ) (REORDER Toys) ) |
Diese Funktion löscht die Sortierzustände aller Datensätze, die auf den aktuellen Datensatz der Tabelle `Persons' verweisen und sortiert anschließend alle unsortierten Datensätze der Tabelle `Toys'.
Siehe auch Sortieren, GETISSORTED, SETISSORTED, REORDER, REORDERALL, GETORDERSTR, SETORDERSTR, PRINT, PRINTF, Demo `Order.bbs'.
16.29.11 Auslösefunktion Feld
Im Feldfenster (siehe Felder erstellen) kann eine Auslösefunktion definiert werden, die immer dann aufgerufen wird, denn der Benutzer den Inhalt des Feldes ändern möchte.
Wurde eine solche Auslösefunktion definiert und der Benutzer ändert den Wert
dieses Feldes, dann wird der Datensatzinhalt nicht automatisch auf den neuen
Wert gesetzt. Stattdessen wird der Wert als erster Parameter an die
Auslösefunktion übergeben. Die Auslösefunktion kann nun den Wert überprüfen
und ihn ablehnen. Um den Wert im Datensatz zu speichern, muss die Funktion
SETQ
verwendet werden.
Die Auslösefunktion sollte das Ergebnis des SETQ
-Aufrufs
(siehe SETQ) oder den alten Wert des Feldes, wenn sie den neuen Wert
abzulehnt, zurückgeben.
Die Auslösefunktion wird auch ausgeführt, wenn ein BeeBase-Programm die
Funktion SETQ*
(siehe SETQ*) zum Setzen eines Feldwertes
aufruft.
Beispiel einer Auslösefunktion Feld
(DEFUN setAmount (amount) (IF some-expression (SETQ Table.Amount amount) (ASKBUTTON NIL "Ungültiger Wert!" NIL NIL) ) Table.Amount ; liefert momentanen Wert zurück ) |
16.29.12 Virtuelle Felder programmieren
In BeeBase sind virtuelle Felder besondere Felder, deren Inhalt immer dann berechnet wird , wenn er benötigt wird. Wird z.B. zu einem anderen Datensatz gewechselt, indem man auf einen der Pfeile in der Panelleiste einer Tabelle klickt, so wird ein virtuelles Feld in dieser Tabelle automatisch neu berechnet und angezeigt (die entsprechenden Einstellungen für das virtuelle Feld vorausgesetzt, siehe Feldobjekteditor). Zum Berechnen des Wertes wird die Auslösefunktion `Berechne' des Feldes aufgerufen. Diese Auslösefunktion kann im Feldfenster (siehe Typabhängige Einstellungen). festgelegt werden. Der Rückgabewert dieser Funktion definiert den Wert des virtuellen Feldes. Wurde keine `Berechne'-Auslösefunktion für ein virtuelles Feld festgelegt, dann ist der Wert des Feldes NIL.
Man kann auch die Berechnung eines virtuellen Feldes auslösen, indem man einfach in einem BeeBase-Programm darauf zugreift, so dass man z.B. auf Knopfdruck zum Berechnen des Wertes eines virtuellen Feldes wie im folgenden nur eine Funktion für den Knopf festlegen muss:
(DEFUN buttonHook () virtual-field ) |
Man kann auch den virtuellen Wert auf einen beliebigen Wert setzen,
indem man die Funktion SETQ
verwendet:
(SETQ virtual-field expr) |
Wird jedoch nach dem SETQ
-Aufruf auf das virtuelle Feld zugegriffen,
dann wird der Wert des virtuellen Feldes neu berechnet.
Der Wert eines virtuellen Feldes wird nicht zwischengespeichert, da nicht einfach festzustellen ist, wann der Wert neu berechnet werden muss und wann nicht. Daher sollte man auf virtuelle Felder möglichst sparsam zugreifen und den Wert in lokalen Variablen für die weitere Verwendung selbst zwischenspeichern.
Für ein Beispiel, wie virtuelle Felder benutzt werden, sehe man sich das Beispielprojekt `Movie.bbs' an.
Siehe auch Virtuelles Feld, Beispielprojekt `Movie.db'.
16.29.13 Berechne-Aktiv-Funktion
Für Feldobjekte und Fensterknöpfe kann eine Auslösefunktion angegeben werden, welche den Aktivzustand des Objekts berechnet. Siehe Feldobjekteditor und Fenstereditor für Informationen wie diese Auslösefunktion angegeben wird.
Die Auslösefunktion wird ohne Argumente aufgerufen. Gibt die Funktion NIL zurück, so wird das Objekt deaktiv, sonst wird es aktiv.
Zum Beispiel kann die Berechne-Aktiv-Funktion für ein Objekt, das aktiv sein soll, wenn ein bestimmtes virtuelles `Listen'-Feld eine aktive Zeile hat, wie folgt aussehen:
(DEFUN enableObject () (GETVIRTUALLISTACTIVE virtual-list-field) ) |
Siehe auch Feldobjekteditor, Fenstereditor, Beispielprojekt `Users.bbs'.
16.29.14 Berechne Datensatzbeschreibung
Für Tabellenobjekte und Feldobjekte vom Typ Referenz kann eine Auslösefunktion zur Berechnung einer Datensatzbeschriftung eingegeben werden (siehe Tabellenobjekteditor und Feldobjekteditor).
Die Auslösefunktion wird ohne Argumente aufgerufen. Sie sollte einen einfachen Ausdruck oder eine Liste von Ausdrücken zurückgeben.
Zum Beispiel, hat eine Tabelle `Person' die Felder `Name' und `Birthday', so könnte die Funktion so aussehen:
(DEFUN personDescription () (LIST Person.Name Person.Birthday) ) |
Siehe auch Tabellenobjekteditor, Feldobjekteditor.
16.29.15 Auslösefunktion Doppelklick
Für virtuelle Felder, welche die Listenanzeige verwenden, kann eine Auslösefunktion angegeben werden, welche immer dann aufgerufen wird, wenn der Benutzer auf ein Listenfeld doppelt klickt. Für Informationen wie eine solche Auslösefunktion für ein virtuelles Feld angegeben werden kann, siehe Feldobjekteditor.
Die Auslösefunktion wird mit drei Argumenten aufgerufen. Das erste Argument gibt die Zeilenummer beginnend mit 1 für die erste Zeile an (Zeile 0 enthält den Listenkopf). Das zweite Argument enthält die Spaltennummer beginnend mit 0. Das dritte Argument ist ein Zeiger auf den Datensatz, aus dem das Listenfeld erzeugt wurde, oder NIL, falls der Eintrag nicht direkt aus einem Datensatz stammt. Der Rückgabewert der Funktion wird ignoriert.
Ein typisches Beispiel für eine Doppelklick-Auslösefunktion ist das folgende.
(DEFUN doubleClickTrigger (row col rec:Table) ... ) |
Hier wurde rec als Datensatzzeiger für Tabelle Table deklariert. Dies ermöglicht den direkten Zugriff von rec auf Felder in Table.
Falls es mehr als eine Tabelle gibt, auf die sich das Datensatzargument beziehen könnte, so ist folgende Konstruktion, welche Typprädikate zu verschiedenen Tabellen einsetzt, nützlich.
(DEFUN doubleClickTrigger (row col rec) (COND ((RECP Table1 rec) (SETQ Table1 rec) ...) ((RECP Table2 rec) (SETQ Table2 rec) ...) ... ) ) |
Es ist möglich, dass das vom Benutzer angeklickte Listenfeld zu keinem Datensatz gehört. In diesem Fall kann das dritte Argument ignoriert und auf das Listenelement wie in folgendem Beispiel zugegriffen werden.
(DEFUN doubleClickTrigger (row col) (PRINT (NTH col (NTH row virtual-field))) ) |
Siehe auch Feldobjekteditor, Beispielprojekt `Movie.bbs'.
16.29.16 Auslösefunktion URL-Drop
Für virtuelle Felder, welche die Listenanzeige verwenden, kann eine Auslösefunktion angegeben werden, welche immer dann aufgerufen wird, wenn der Benutzer eine Liste von URLs (z.B. Dateinamen) per Drag und Drop auf das Listenfeld zieht. Für Informationen wie eine solche Auslösefunktion für ein virtuelles Feld angegeben werden kann, siehe Feldobjekteditor.
Die Auslösefunktion wird mit einem Memo-Text aufgerufen, welcher alle URLs enthält, eines pro Zeile. Jedes URL, das zu einem lokalen Dateinamen gehört, d.h. mit file:// beginnt, wird durch den lokalen Dateinamen ersetzt, indem der file://-Prefix entfernt wird. Alle anderen URLs bleiben unverändert. Der Rückgabewert der Funktion wird ignoriert.
Siehe auch Feldobjekteditor.
16.29.17 Auslösefunktion Sortieren-Drop
Für virtuelle Felder, welche die Listenanzeige verwenden, kann eine Auslösefunktion angegeben werden, welche immer dann aufgerufen wird, wenn der Benutzer ein Listenelement zum Sortieren per Drag und Drop auf eine neue Zeile im Listenfeld zieht.
Für Informationen wie eine solche Auslösefunktion für ein virtuelles Feld angegeben werden kann, siehe Feldobjekteditor.
Die Auslösefunktion wird mit drei Argumenten aufgerufen. Das erste Argument gibt die alte Zeilenummer des Listenelements beginnend mit 1 für die erste Zeile an (Zeile 0 enthält den Listenkopf). Das zweite Argument enthält die neue Zeilennummer (ebenfalls beginnend mit 1). Das dritte Argument ist ein Zeiger auf den Datensatz, aus dem das Listenfeld erzeugt wurde, oder NIL, falls der Eintrag nicht direkt aus einem Datensatz stammt. Der Rückgabewert der Funktion wird ignoriert.
Ein typisches Beispiel für eine Sortieren-Drop-Auslösefunktion in einem Feld virtual-list ist das folgende.
(DEFUN sortDropTrigger (oldRow newRow rec) (MOVEREC rec (RECNUM (GETREC (NTH newRow virtual-list)))) ) |
Siehe auch Feldobjekteditor, MOVEREC, RECNUM, GETREC, NTH, Beispielprojekt `Main.bbs'.
16.29.18 Berechne Listenansichts-Auswahltexte
Für Zeichenkettenfelder kann neben dem GUI-Element ein Listenansicht-Popup-Knopf plaziert werden, welcher bei Drücken eine Liste von Auswahltexten anzeigt, aus welcher der Benutzer wählen kann. Die Auswahltexte in dieser Liste können statisch sein, oder aber durch eine Auslösefunktion berechnet werden. Siehe Feldobjekteditor für mehr Informationen, wie zwischen statischen und berechneten Auswahltexten ausgewählt werden kann und wie die Auslösefunktion angegeben wird.
Die Auslösefunktion zur Berechnung der Auswahltexte hat keine Argumente. Sie gibt einen Memo-Text, bei der jede Zeile eine Beschriftung enthält, oder NIL für keine Beschriftungen zurück.
Zum Beispiel kann die Berechnungsfunktion wie folgt aussehen:
(DEFUN computeLabels () "Tokio\nMünchen\nLos Angeles\nRom" ) |
Siehe auch Berechne Referenz-Datensätze, Feldobjekteditor.
16.29.19 Berechne Referenz-Datensätze
Für Referenz-Felder wird neben dem GUI-Element für gewöhnlich ein Popup-Knopf angebracht, welcher bei Drücken eine Liste von Datensätzen anzeigt, aus welcher der Benutzer wählen kann. Die Liste dieser Datensätze kann durch eine Auslösefunktion berechnet werden. Siehe Feldobjekteditor für mehr Informationen, wie die Auslösefunktion für Referenz-Felder angegeben wird.
Die Auslösefunktion zur Berechnung der Datensatzliste hat keine Argumente. Sie gibt einen Liste zurück, welche nach Datensätzen der referenzierten Tabelle durchsucht wird. Jeder solche gefundene Datensatz wird in die anzuzeigende Liste mit aufgenommen. Einträge, die keine Datensätze sind, werden stillschweigend ignoriert.
Eine typische Funktion zur Berechnung der Referenz-Datensatzliste ist das folgende Beispiel. Gegeben sei ein Projekt mit einer Tabelle `Person', welches ein Boolesches Feld `Female' enthält. Dann zeigt die folgende Berechnungsfunktion nur die weiblichen Personen im Referenz-Popup an:
(DEFUN computeFemaleRecords () (SELECT Person FROM Person WHERE Female) ) |
Siehe auch Berechne Listenansicht-Auswahltexte, Feldobjekteditor.
16.30 Liste veralteter Funktionen
Die folgenden Funktionen sind veraltet.
GETDISABLED
SETDISABLED
GETWINDOWDISABLED
SETWINDOWDISABLED
Veraltete Funktionen arbeiten nicht mehr wie erwartet und ein Aufruf wird entweder ignoriert (was einer Null-Operation entspricht), ein Warn-Dialog wird geöffnet, oder ein Fehler wird generiert. Menüpunkt `Programm - Veraltete Funktionen' legt das genaue Vorgehen fest (siehe Veraltete Funktionen).
Es wird empfohlen, alle veralteten Funktionen im Projekt-Programm zu entfernen, und die Funktionalität über die Aktiv/Inaktiv-Einstellung der Feldobjekte und Fensterknöpfe zu realisieren (siehe Berechne-Aktiv-Funktion).
[ << ] | [ >> ] | [Anfang] | [Inhalt] | [Index] | [ ? ] |
Dieses Dokument wurde am 30. September 2024 mit texi2html generiert.