Informatik 1, WS 2019/20 Universität Tübingen
Total Page:16
File Type:pdf, Size:1020Kb
Informatik 1, WS 2019/20 Universität Tübingen Prof. Dr. Klaus Ostermann February 11, 2020 mit Beiträgen von Jonathan Brachthäuser, Yufei Cai, Yi Dai und Tillmann Rendel Große Teile dieses Skripts basieren auf dem Buch "How To Design Programs" von M. Felleisen, R.B. Findler, M. Flatt und S. Krishnamurthi. 1 Contents 1 Programmieren mit Ausdrücken 7 1.1 Programmieren mit arithmetischen Ausdrücken . 7 1.2 Arithmetik mit nicht-numerischen Werten . 9 1.3 Auftreten und Umgang mit Fehlern . 14 1.4 Kommentare . 15 1.5 Bedeutung von BSL Ausdrücken . 16 2 Programmierer entwerfen Sprachen! 20 2.1 Funktionsdefinitionen . 20 2.2 Funktionen die Bilder produzieren . 21 2.3 Bedeutung von Funktionsdefinitionen . 23 2.4 Konditionale Ausdrücke . 24 2.4.1 Motivation . 24 2.4.2 Bedeutung konditionaler Ausdrücke . 25 2.4.3 Beispiel . 26 2.4.4 Etwas syntaktischer Zucker... 26 2.4.5 Auswertung konditionaler Ausdrücke . 28 2.4.6 In der Kürze liegt die Würze . 29 2.5 Definition von Konstanten . 30 2.6 DRY: Don’t Repeat Yourself! . 30 2.6.1 DRY durch Konstantendefinitionen . 31 2.6.2 DRY Redux . 33 2.7 Bedeutung von Funktions- und Konstantendefinitionen . 34 2.8 Programmieren ist mehr als das Regelverstehen! . 36 3 Systematischer Programmentwurf 37 3.1 Funktionale Dekomposition . 37 3.2 Vom Problem zum Programm . 39 3.3 Systematischer Entwurf mit Entwurfsrezepten . 40 3.3.1 Testen . 41 3.3.2 Informationen und Daten . 42 3.3.3 Entwurfsrezept zur Funktionsdefinition . 44 3.3.4 Programme mit vielen Funktionen . 48 3.4 Information Hiding . 49 4 Batchprogramme und interaktive Programme 51 4.1 Batchprogramme . 51 4.2 Interaktive Programme . 53 4.2.1 Das Universe Teachpack . 53 5 Datendefinition durch Alternativen: Summentypen 57 5.1 Aufzählungstypen . 57 5.2 Intervalltypen . 58 2 5.3 Summentypen . 61 5.3.1 Entwurf mit Summentypen . 62 5.4 Unterscheidbarkeit der Alternativen . 63 6 Datendefinition durch Zerlegung: Produkttypen 65 6.1 Die posn Struktur . 65 6.2 Strukturdefinitionen . 66 6.3 Verschachtelte Strukturen . 67 6.4 Datendefinitionen für Strukturen . 69 6.5 Fallstudie: Ein Ball in Bewegung . 70 6.6 Tagged Unions und Maybe . 73 6.7 Erweiterung des Entwurfsrezepts . 73 7 Datendefinition durch Alternativen und Zerlegung: Algebraische Da- tentypen 75 7.1 Beispiel: Kollisionen zwischen Shapes . 75 7.2 Programmentwurf mit ADTs . 78 7.3 Refactoring von algebraischen Datentypen . 79 8 Bedeutung von BSL 82 8.1 Wieso? . 82 8.2 Kontextfreie Grammatiken . 83 8.2.1 Beispiel einer kontextfreien Grammatik . 83 8.2.2 Syntax von EBNF in EBNF . 84 8.2.3 Konstruktion von Ableitungsbäumen . 85 8.3 Syntax von BSL . 86 8.4 Die BSL Kernsprache . 87 8.5 Werte und Umgebungen . 88 8.6 Auswertungspositionen und die Kongruenzregel . 89 8.7 Nichtterminale und Metavariablen - Keine Panik! . 90 8.8 Bedeutung von Programmen . 90 8.9 Bedeutung von Ausdrücken . 91 8.9.1 Bedeutung von Funktionsaufrufen . 91 8.9.2 Bedeutung von Konstanten . 91 8.9.3 Bedeutung konditionaler Ausdrücke . 91 8.9.4 Bedeutung von Strukturkonstruktoren und Selektoren . 92 8.10 Reduktion am Beispiel . 92 8.11 Bedeutung von Daten und Datendefinitionen . 94 8.12 Refactoring von Ausdrücken und Schliessen durch Gleichungen . 94 9 Daten beliebiger Größe 97 9.1 Rekursive Datentypen . 97 9.2 Programmieren mit rekursiven Datentypen . 99 9.3 Listen . 103 9.3.1 Listen, hausgemacht . 103 9.3.2 Listen aus der Konserve . 104 3 9.3.3 Die list Funktion . 106 9.3.4 Datentypdefinitionen für Listen . 106 9.3.5 Aber sind Listen wirklich rekursive Datenstrukturen? . 107 9.3.6 Natürliche Zahlen als rekursive Datenstruktur . 108 9.4 Mehrere rekursive Datentypen gleichzeitig . 109 9.5 Entwurfsrezept für Funktionen mit rekursiven Datentypen . 110 9.6 Refactoring von rekursiven Datentypen . 111 9.7 Programmäquivalenz und Induktionsbeweise . 112 10 Pattern Matching 116 10.1 Pattern Matching am Beispiel . 116 10.2 Pattern Matching allgemein . 118 10.2.1 Syntax von Pattern Matching . 118 10.2.2 Bedeutung von Pattern Matching . 118 10.2.3 Reduktion von Pattern Matching . 120 10.2.4 Pattern Matching Fallstricke . 120 11 Quote und Unquote 122 11.1 Quote . 122 11.2 Symbole . 123 11.3 Quasiquote und Unquote . 124 11.4 S-Expressions . 125 11.5 Anwendungsbeispiel: Dynamische Webseiten . 127 12 Sprachunterstützung für Datendefinitionen und Signaturen 128 12.1 Ungetypte Sprachen . 129 12.2 Dynamisch getypte Sprachen . 129 12.3 Dynamisch überprüfte Signaturen und Contracts . 131 12.4 Statisch getypte Sprachen . 135 13 Sprachunterstützung für Algebraische Datentypen 138 13.1 ADTs mit Listen und S-Expressions . 139 13.2 ADTs mit Strukturdefinitionen . 140 13.3 ADTs mit define-type . 141 13.4 Ausblick: ADTs mit Zahlen . 143 13.5 Diskussion . 145 13.6 Ausblick: ADTs mit Dictionaries . 147 14 DRY: Abstraktion überall! 149 14.1 Abstraktion von Konstanten . 149 14.2 Funktionale Abstraktion . 149 14.3 Funktionen als Funktionsparameter . 150 14.4 Abstraktion in Signaturen, Typen und Datendefinitionen . 153 14.4.1 Abstraktion in Signaturen . 153 14.4.2 Signaturen für Argumente, die Funktionen sind . 155 14.4.3 Funktionen höherer Ordnung . 156 4 14.4.4 Polymorphe Funktionen höherer Ordnung . 157 14.4.5 Abstraktion in Datendefinitionen . 158 14.4.6 Grammatik der Typen und Signaturen . 158 14.5 Lokale Abstraktion . 159 14.5.1 Lokale Funktionen . 159 14.5.2 Lokale Konstanten . 160 14.5.3 Intermezzo: Successive Squaring . 162 14.5.4 Lokale Strukturen . 163 14.5.5 Scope lokaler Definitionen . 163 14.6 Funktionen als Werte: Closures . 164 14.7 Lambda, die ultimative Abstraktion . 165 14.8 Wieso abstrahieren? . 166 15 Programmieren mit Higher-Order Funktionen 168 15.1 Funktionskomposition und "Point-Free Style" . 168 15.2 Currying und Typisomorphien von Funktionstypen . 169 15.3 Map, filter, flatmap . 170 15.4 Konstruktion von Listen mit unfold . 172 15.5 Fold und unfold zusammen, Deforestation . 173 15.6 Verallgemeinerung von fold und unfold auf beliebige algebraische Da- tentypen . 174 16 Bedeutung von ISL+ 177 16.1 Syntax von Core-ISL+ . 177 16.2 Werte und Umgebungen . 177 16.3 Bedeutung von Programmen . 178 16.4 Auswertungspositionen und die Kongruenzregel . 178 16.5 Bedeutung von Ausdrücken . 178 16.5.1 Bedeutung von Funktionsaufrufen . 178 16.5.2 Bedeutung von lokalen Definitionen . 179 16.5.3 Bedeutung von Konstanten . 180 16.6 Scope . 180 17 Generative Rekursion 182 17.1 Wo kollidiert der Ball? . 182 17.2 Schnelles Sortieren . ..