XLISP ist die bekannte PD-Version der Sprache LISP vom Altmeister David M. Betz, Senior-Editor der Zeitschrift BYTE in den USA. In der PD der ST Computer sind der Reihe nach die Versionen 1.4,1.5 und 1.7/1.71 erschienen. Alle Versionen waren von vornherein als experimentell und damit als vorläufige Versionen gekennzeichnet. Die neueste Version 2.0 vom 6.2.1988 macht da schon eher einen beständigen Eindruck. Der folgende Bericht soll die Eigenschaften dieser XLISP-Version im Vergleich zu den vorigen untersuchen. Denn immerhin ist XLISP für den ATARI ST Computer zur Zeit die am ehesten dem Common LlSP-Standard entsprechende LISP-Version und dazu noch kostenlos.
Auf der PD-Diskette sind ca. 256 kByte Information und Programme enthalten. Davon entfallen ca. 82 kByte allein auf die Dokumentation, die im knappen Stil der vorigen Dokumentation gehalten ist. Auch das neue XLISP 2.0 verzichtet auf GEM und kommt gleich nach dem Start im VT52-Modus zur Sache. Es werden auch wieder einige nützliche Utilities wie der Pretty Printer PP.LSP mitgeliefert, deren Syntax wurde allerdings geändert. Funktionen und Macros können mit (PP-DEF < Funktionsname > < Stream >) auf einem Stream. (Default: Bildschirm) ein File kann mit (PP-FILE < Filename > < Stream >) ausgegeben werden. Hier ist im Original ein Fehler. Es wird die Funktion OPENI verlangt, die nirgends deklariert ist. Ich habe diese Funktion im File PP eingefügt und hoffe, daß sie funktioniert. Auf der Diskette ist weiterhin ein Programm QA.LSP aufzufinden. Es handelt sich hier um die LISP-Version der Resolutionsmethode, wie sie in allen PROLOG Interpretern angewendet wird.
Es scheint so, daß die Änderungen am Programm im wesentlichen zur Fehlerreduktion des Interpreters geführt haben. Fehler der Version 1.7 bzw. 1.71 wie die Fehlfunktion der PftOG-Funktion bzw. die fehlerhafte Funktion der OBJECT-orientierten Funktionen scheinen jetzt behoben zu sein. Der Sprachumfang ist etwas erweitert und noch mehr dem Common LISP-Standard angeglichen worden. Schauen wir uns die Änderungen im Detail an Hand des Handbuches an.
Die Unterschiede beginnen beim Start des Interpreters. Wenn XLISP 2.0 gestartet wird, wird zunächst im aktuellen Inhaltsverzeichnis nach der Datei XLISP.WKS gesucht, die den zuletzt gesicherten Workspace enthält. Diese kann mit der .S’/H'F-Funktion abgespeichert werden und steht danach mit dem Start zur Verfügung. Man kann sich also seine eigene Version von XLISP zurechtschneiden und in Zukunft den Workspace mit allen Einstellungen beim Start übernehmen. Dann erst wird INIT.LSP geladen und anschließend die in der Kommandozeile angegebenen Dateien.
An Datenstrukturen bietet die neue Version folgende zusätzliche Datentypen:
Characters, Streams und Closures. Cha-racters bedürfen keiner weiteren Erläuterung. Streams sind eigentlich nur die alten File Pointer, deren Syntax in Richtung Common LISP angeglichen wurde. Als Closures werden die benutzerdefinierten Funktionen bezeichnet. Völlig neu ist also eigentlich nur der Character Datentyp.
Neue Symbole sind ebenfalls hinzugekommen. Es handelt sich um error-output, trace-output und debu-out-put, die den jeweiligen Ausgabestrom definieren. Mit den Symbolen integer-format, float-format und print-case kann das Ausgabeformat festgelegt werden. Die Symbole '+’, '++’ und '+++’ sind an die letzten drei Eingaben gebunden, entsprechend '’ und “*’ an (jjg (jpgj letzten Ergebnisse.
Die neuen Evaluationsfunktionen sind (GET-LAMBDA-EXPRESSION
Endlich ist im Bereich der Symbolfunktionen auch die Funktion PSETQ aus dem Common LISP-Reservoir definiert.
An Array-Funktionen ist (VECTOR
In LISP stellen die Listenfunktionen ja den Kern der Sprache dar. Hier sind nun endlich die leichter verständlichen Funktionen FIRST, SECOND, THIRD, FOURTH und REST als Synonym für CAR, CADR, CADDR, CADDR und CDR definiert worden. Neu sind auch (RE-MOVE-IF ), die aus einer Liste je nach Ausgang des Tests Elemente entfernen. Die entsprechenden destruktiven Funktionen lauten DE-LETE-IF bzw. DELETE-IF-NOT. Als sehr nützlich dürfte sich auch der neue .SOAT-Befehl erweisen.
Auch bei den Prädikatenfunktionen sind neue hinzugekommen. ENDP testet das Ende einer Liste, INTEGERP, FLOATP, STRINGP CHARACTERP, ARRAYP, STREAMP, OBJECTP testen, welcher Datentyp vorliegt.
Bei WHEN und UNLESS handelt es sich um zwei neue Kontrollstrukturen, die dem //--Konstrukt sehr ähnlich sind. FLET, LABELS, MACROLET und UN-WIND-PROTECT erzeugen neue Funktionen bzw. kontrollieren die Evaluation eines Terms.
An Schleifenkonstrukten ist das gute alte LOOP hinzugekommen.
Bei den PROGRAM-Features ist es nun möglich, Blöcke zu benennen und abzuarbeiten.
Die Funktionen TRACE und UNTRACE, die bisher extra geladen werden mußten, sind nunmehr im Standardumfang der Sprache enthalten.
Bei den arithmetischen Funktionen ist GCD (der größte gemeinsame Teiler) hinzugekommen.
Dramatisch verändert hat sich die String-Bibliothek. Sie hat sich erweitert um Funktionen, die einen String trimmen (.STRING-TRIM, STRING-LEFT-TRIM, STRING-RIGHT-TRIM), in Groß- bzw. Kleinschrift umsetzen (nichtdestruktiv: STRING-UPCASE, STR1NG-DOWN-CASE: destruktiv: NSTRING-UPCASE, NSTRING-DOWNCASE) sowie mehrere Strings miteinander vergleichen können (was in BASIC, PASCAL und C schon lange geht).
Ganz neu sind die Character-Funktionen, die Zeichenextraktion aus einem String ermöglichen, auf das Vorliegen von Klein /Großbuchstaben, Ziffern oder ähnlichem testen bzw. die entsprechende Umwandlung übernehmen. Auch Zeichenvergleiche sind möglich.
Die Terminologie der Input-/Output-Funktionen wurde dem Stream-Konzept
von Common LISP angeglichen. Was bisher als File Pointer deklariert war, wird nun als Stream deklariert. Neu ist hier allerdings die Möglichkeit formatierter Ausgabe. Ebenso ist die Ein-/Ausgabe über String-Streams neu.
Bei den Systemfunktionen ist die Möglichkeit hinzugekommen, den aktuellen Workspace abzuspeichern und später wieder zu restaurieren.
Das XLISP 2.0 ist dem Common LISP-Standard noch näher gerückt. Es wurde mit dem Mark Williams C-Compiler compiliert. In den Quelltexten der mitgelieferten LISP-Programme sind die Änderungen von der Version 1.7 zur Version 2.0 nicht konsequent durchgeführt, die notwendigen Korrekturen (siehe OPENI wie oben erwähnt) dürften aber auch LISP-Anfängern leichtfallen. Es lohnt sich für alle, die sich für LISP interessieren, diese neue Version zu besorgen.
Dr. K. Sarnow