MIRA. You have often Begun to tell me what I am ; but stopp 'd, And teft me to a bootless inquisition, Concluding , Stay ; not yet. ' PRO. The how"'" now come ,. The very minute bids thee ope thine car. "The Tempest" von William Shakespeare (Akt 1, S::;cnc 1) Das vorliegende Buch ist aus Begleitmaterialien zu einem Programmierkurs entstanden, den ich im Sommersemester 1991 an der Universität Bonn gehalten habe. Es beschreibt grundlegende und weiterführende Kom;epte der funktionalen l Programmierung und der Programmiersprache Miranda . Eine rein funktionale Sprache wie Miranda ist aus mindestens drei Gründen eine interessante und faszinierende Alternative sowohl zu herkömmlichen, impera tiven Sprachen als auch zu hybriden Sprachen wie LISP oder Scheme, die neben einem funktionalen Kern viele imperative Konstrukte inkorporieren. 1. Funktionale Programme sind kürzer, einfacher zu verstehen und besitzen ei nen höheren Abstraktionsgrad als korrespondierende imperative Programme. 2. Sie sind einer mathematischen Behandlung einfacher zugänglich. 3. Die angenehmen mathematischen Eigenschaften (Funktionen sind Funktio nen im mathematischen Sinn) erleichtern eine Implementierung auf paralle len Rechnerarchitekturen. Insbesondere der letzte Punkt eröffnet für die Zukunft vielversprechende Perspek tiven. Miranda verkörpert die Tugenden funktionaler Sprachen in besonderer Weise. Die Syntax ist prägnant und frei von syntaktischem Ballast. Funktionen wie Typen werden mittels (rekursiver) Gleichungen definiert. Muster auf der linken Seite von Funktionsdefinitionen fördern die Lesbarkeit der Definitionen.
1 Einleitung.- 1.1 Eigenschaften funktionaler Sprachen.- 1.2 Überblick über Miranda.- 1.3 Warum nicht LISP oder Scheme?.- 1.4 Literaturhinweise.- 2 Vordefinierte Typen.- 2.1 Der Typ num.- 2.2 Der Typ bool.- 2.3 Der Typ char.- 2.4 Tupeltypen.- 2.5 Listentypen.- 2.6 Funktionale Typen.- 2.7 Miranda-System.- 2.8 Syntax.- 3 Definitionen.- 3.1 Skalare Definitionen.- 3.2 Konforme Definitionen.- 3.3 Lokale Definitionen.- 3.4 Syntax.- 4 Typsystem.- 4.1 Parametrisierter Typpolymorphismus.- 4.2 Typinferenz.- 4.3 Wertespezifikationen.- 4.4 Typsynonyme.- 4.5 Die generische Funktion show.- 4.6 Literaturhinweise.- 4.7 Syntax.- 5 Funktionen höherer Ordnung.- 5.1 Partiell parametrisierte Funktionen.- 5.2 Operator-Sections.- 5.3 Generische Funktionen.- 5.4 Funktionen als Datenstrukturen.- 5.5 Implementierung von Rekursionsmustern.- 5.6 Literaturhinweise.- 5.7 Syntax.- 6 List-Comprehensions.- 6.1 Einfache List-Comprehensions.- 6.2 Iterative Generatoren.- 6.3 Diagonalisierende List-Comprehensions.- 6.4 Syntax.- 7 Benutzerdefinierte Typen.- 7.1 Algebraische Datentypen.- 7.2 Abstrakte Datentypen.- 7.3 Platzhaltertypen.- 7.4 Literaturhinweise.- 7.5 Syntax.- 8 Lazy Evaluation.- 8.1 Eager Evaluation versus Lazy Evaluation.- 8.2 Nichtstrikte Funktionen.- 8.3 Backtracking-Probleme.- 8.4 Kombinator-Parsing.- 8.5 Von Prolog zu Miranda.- 8.6 Unendliche Datenstrukturen.- 8.7 Programmierung mit Unbekannten.- 8.8 Steuerung der Auswertung.- 8.9 Literaturhinweise.- 9 Programmierung im Großen.- 9.1 %include- und %export-Direktive.- 9.2 Parametrisierte Module.- 9.3 Software-Engineering.- 9.4 Programmierrichtlinien für Miranda.- 9.5 Literaturhinweise.- 9.6 Syntax.- 10 Interaktive Programme.- 10.1 Eingabe.- 10.2 Interpretierte Eingabe.- 10.3 Ausgabe.- 10.4 Einbindung in UNIX.- 10.5 FortsetzungsbasierteEin- und Ausgabe.- 10.6 Literaturhinweise.- A Kleine Projekte.- A.1 Taschenrechner.- A.2 Datenbank.- A.3 KWIC-Index.- A.4 Textformatierung.- B Blaise-Compiler.- B.1 Ziel des Projektes.- B.2 Projektbeschreibung.- B.2.1 Definition von Blaise.- B.2.2 Definition der Zielmaschine.- B.2.3 Programmierumgebung.- B.3 Projektorganisation.- B.3.1 Gruppe 1: Lexikalische Analyse und Symboltabelle.- B.3.2 Gruppe 2: Syntaktische Analyse.- B.3.3 Gruppe 3: Codeerzeugung.- B.3.4 Gruppe 4: Interpreter und Programmierumgebung.- Literatur.