Skip to main content

1984 | Buch

LISP

Eine Einführung in die Programmierung

verfasst von: Dr. Ing. habil. Herbert Stoyan, Dipl.-Math. Günter Görz

Verlag: Springer Berlin Heidelberg

Buchreihe : Studienreihe Informatik

insite
SUCHEN

Inhaltsverzeichnis

Frontmatter

Einleitung

1. Einleitung
Zusammenfassung
Es gibt zwei wesentliche Gründe, LISP zu lernen: Zum einen hat LISP interessante Anwendungsgebiete, die sich nur über die Kenntnis der Programmiersprache vollends erschließen lassen. Zum zweiten enthält LISP als Programmiersprache viele einzigartige Elemente und präsentiert viele Konzepte, die aus anderen konventionellen Programmiersprachen auch bekannt sind, in anderer Weise.
Herbert Stoyan, Günter Görz

Einfache Terme und der Umgang mit Objekten

2. Einfache Terme und der Umgang mit Objekten
Zusammenfassung
Um einen Dialog allereinfachster Art mit dem LISP-System führen zu können, setzen wir die Kenntnis des Gegenstandsbereichs der natürlichen Zahlen voraus.
Herbert Stoyan, Günter Görz

Primitive Datenobjekte — zugeordnete Grundfunktionen und externe Repräsentation

3. Primitive Datenobjekte — zugeordnete Grundfunktionen und externe Repräsentation
Zusammenfassung
In diesem Kapitel wollen wir systematisch die primitiven Datenobjekte, die ihnen zugeordneten Grundfunktionen und ihre externe Repräsentation vorstellen. Leider gibt es schon hier Unterschiede zwischen den verschiedenen LISP-Dialekten; somit gelten die Aussagen strenggenommen nur für den von uns verwendeten Dialekt „TLC-LISP“. Dennoch dürfen die Unterschiede auch nicht überbetont werden, denn bezüglich der Prinzipien der Programmierung sind sie nicht so wichtig. Wenn man aber Programme in mehreren verschiedenen Systemen ablaufen lassen will, lösen gerade die kleinsten Unterschiede oft peinliche Fehler aus.
Herbert Stoyan, Günter Görz

Das LISP-System im einfachen Dialog

4. Das LISP-System im einfachen Dialog
Zusammenfassung
Wenn wir uns an das eingabebereite LISP-System setzen und auf das Prompt-Zeichen mit einem Term
$$ >(ADD123) $$
antworten, muß uns nun, nachdem wir die primitiven Datenstrukturen kennen und etwas über externe Repräsentation wissen, sofort auffallen, daß ein solcher Term streng nach den Regeln der Listennotation gebildet ist.
Herbert Stoyan, Günter Görz

Funktionsdefinition als Abstraktion über Termen

5. Funktionsdefinition als Abstraktion über Termen
Zusammenfassung
Die umgangssprachliche Verwendung des Wortes „abstrakt“ bringt es in die Nähe von „vage“, „unklar“ und „unverständlich“ und identifiziert es mit „un-konkreter werden“. Mit diesem Sprachgebrauch wird aber die Bedeutung der Abstraktion verdeckt. Ein Grund für dieses Mißverständnis kann darin liegen, daß der Zweck der Abstraktion nicht erkannt wird. Hinzu kommt, daß nicht jeder Versuch, zu abstrahieren, glückt, weil der Abstrahierende oft zu sehr das Anschauliche aus den Augen verliert. Beispiele für erfolgreiche Abstraktionen zeichnen sich dadurch aus, daß das Abstrakte auf das Konkrete bezogen ist und aus ihm seine Bedeutung gewinnt.
Herbert Stoyan, Günter Görz

Komplexe Datenstrukturen und ihre Verarbeitung — Rekursion und Iteration

6. Komplexe Datenstrukturen und ihre Verarbeitung — Rekursion und Iteration
Zusammenfassung
Das Zusammenfügen von Termen — prozeduralen Bausteinen — ist möglich, weil Terme verschachtelt werden können: An Argumentstellen dürfen sowohl einfache Grundbausteine (zu sich selbst ausgewertete Objekte und Symbole) als auch Terme stehen. Die Grundbausteine selbst können zwar bei, aber nicht zu der Verschachtelung verwendet werden.
Herbert Stoyan, Günter Görz

Kontrollstrukturen, Spezialformen und Macros

7. Kontrollstrukturen, Spezialformen und Macros
Zusammenfassung
Die im letzten Kapitel vorgestellten Listenverarbeitungsfunktionen sind klassische Beispiele für den funktionalen Programmierstil. Dabei haben wir in der Rekursion das klassische Organisationsprinzip dieses Programmierstils kennengelernt. Gehen wir bei der Implementierung streng danach vor, so ist aus unseren Programmen nichts über ihren Ablauf ersichtlich. Streng funktional gesehen können wir lediglich Terme ineinanderschachteln, deren Auswertung nach einem gegebenen Schema, einer allgemeinen Auswertungsregel, erfolgt, wobei für einige Funktionssymbole Ausnahmen gelten. Eine solche Ausnahme ist der bedingte Ausdruck, der COND-Term.1 Es wird also nur minimale Information über das Verhalten des Programms dargestellt, keinesfalls konkrete Eigenschaften der Programmausführung wie Zeitbedarf, Speicherbedarf oder einzelne Ausführungsschritte.
Herbert Stoyan, Günter Görz

Ein- und Ausgabe

8. Ein- und Ausgabe
Zusammenfassung
Zwischen der „internen Welt“ der LISP-Objekte und der Außenwelt ist Kommunikation möglich. Sie kann grundsätzlich in beiden Richtungen erfolgen. Durch diese Kommunikation werden Objekte erzeugt, Auswertungsvorgänge angestoßen, während deren Verlauf wiederum Objekte erzeugt oder verändert werden oder gar verloren gehen können. Während der Kommunikation werden externe Repräsentationen von Objekten hergestellt.
Herbert Stoyan, Günter Görz

Funktionsobjekte

9. Funktionsobjekte
Zusammenfassung
In den vorhergehenden Kapiteln trat bereits mehrfach das Problem auf, eine Funktion FN schrittweise auf alle Elemente einer Liste oder Menge anzuwenden und aus den Resultaten eine neue Liste zu bilden. Offensichtlich muß für jedes Element ein Term
$$ (FN<Element >) $$
ausgewertet werden.
Herbert Stoyan, Günter Görz

Generische Funktionen und datengesteuerte Programmierung

10. Generische Funktionen und datengesteuerte Programmierung
Zusammenfassung
An einem Anwendungsbeispiel, der Implementierung eines Programmsystems für Arithmetik, wollen wir uns vor Augen führen, inwiefern die Einführung einer weiteren Abstraktionsstufe für Funktionen sinnvoll ist. Die Fragestellung, der wir uns zuwenden wollen, tritt immer dann auf, wenn in einem Programmsystem Objekte verarbeitet werden sollen, die zwar verschiedene Typen haben, jedoch unter einen gemeinsamen Oberbegriff fallen und damit eine Reihe von Ähnlichkeiten aufweisen. So ist die Situation, wenn wir Arithmetik treiben wollen: Wir haben bisher Integer- und Realzahlen kennengelernt und sogar (Kapitel 6) einen neuen Typ, die rationalen Zahlen, hinzugefügt. Damit müssen wir schon vier Arten von arithmetischen Funktionen unterscheiden, und mit jedem neu hinzukommenden Typ von Zahlen — z. B. komplexen Zahlen — wird die Lage unübersichtlicher.
Herbert Stoyan, Günter Görz

Regel-orientierte Programmierung

11. Regel-orientierte Programmierung
Zusammenfassung
Im ersten Kapitel hatten wir drei Programmierstile in ihren Grundzügen dargestellt und ausgeführt, da¿ jeder dieser Stile auf einem charakteristischen Modell der Informationsverarbeitung basiert. Bei diesen Programmierstilen und ihren zugehörigen Verarbeitungsmodellen handelt es sich um:
Herbert Stoyan, Günter Görz

Verarbeitung von LISP in LISP

12. Verarbeitung von LISP in LISP
Zusammenfassung
Wir setzen voraus, daß bekannt ist, wodurch sich ein Interpreter von einem Compiler unterscheidet und fassen die Unterschiede noch einmal kurz zusammen:
Ein Interpreter überführt die in einer Programmiersprache geschriebenen Quellen-Texte von Programmen in eine geeignete interne Datenrepräsentation — dies kann u. U. sogar direkt die Folge der gegebenen Zeichen selbst sein — und führt dann Aktionen aus, die durch die Programme beschrieben werden. Dies erfordert, daß der Programmtext jedesmal neu analysiert werden muß.
Herbert Stoyan, Günter Görz

Anhänge

Frontmatter
13. Einige Bemerkungen über Programmiersysteme für LISP
Zusammenfassung
Die Interaktion mit dem LISP-System besteht im Normalfall aus einem Dialog mit der sog. „Top-Level“-Schleife, die einen Term einliest, seine Auswertung veranlaßt, deren Ergebnis ausgibt, und danach den Zyklus Einlesen-Auswerten-Ausgeben wieder von vorne beginnt. Dadurch kann der Programmierer in jedem Schritt neue LISP-Objekte erzeugen oder vorhandene modifizieren und so die Systemumgebung immer weiter bereichern. Durch Umlenken der Ein- und Ausgabeströme kann er globale Zustände dieser Umgebung oder bestimmte Ausschnitte davon auf Dateien sichern und sie durch Einlesen von Dateien um weitere Komponenten anreichern. Alle derartigen Leistungen stehen in jedem LISP-System durch unmittelbaren Aufruf von vorgegebenen Funktionen und Pseudofunktionen zur Verfügung.
Herbert Stoyan, Günter Görz
14. Funktionenverzeichnis
Zusammenfassung
In diesem Verzeichnis sind alle im Text definierten bzw. benutzten Funktionen aufgeführt. Damit der Leser die angegebenen Programme auch in anderen LISP-Dialekten verwenden kann, werden die Grundfunktionen durch Fettdruck besonders herausgehoben. Dabei werden folgende LISP-Dialekte berücksichtigt (in Klammern steht jeweils die verwendete Kurzbezeichnung):
1.
CommonLISP (C)
 
2.
InterLISP (I)
 
3.
LISP-Machine-LISP (L) — auch ZetaLISP
 
4.
MACLISP (M)
 
5.
TLC-LISP (T) und
 
6.
UCI-LISP (U).
 
Herbert Stoyan, Günter Görz
15. Übersicht über die Abweichungen der Funktionsdefinition in anderen LISP-Dialekten
Zusammenfassung
Dieser Anhang bezieht sich auf den Anhang B. Dort waren Anmerkungen bei Grundfunktionen gemacht worden, wenn sich die verwendete Definition von der in den Dialekten CommonLISP, InterLISP, LISP-Machine-LISP, MacLISP und UCI-LISP unterschied.
Herbert Stoyan, Günter Görz

Literaturverzeichnis

16. Literaturverzeichnis
Zusammenfassung
Die am Ende jedes Zitats in Klammern angebenen Zahlen bezeichnen das Kapitel, in dem das betreffende Werk zitiert wird.
Herbert Stoyan, Günter Görz
Backmatter
Metadaten
Titel
LISP
verfasst von
Dr. Ing. habil. Herbert Stoyan
Dipl.-Math. Günter Görz
Copyright-Jahr
1984
Verlag
Springer Berlin Heidelberg
Electronic ISBN
978-3-642-71455-9
Print ISBN
978-3-540-16914-7
DOI
https://doi.org/10.1007/978-3-642-71455-9