Roberto lerusalimschy Programmieren mit Lua \
Vorwort 13 1 Die Sprache 21 1 Einführung/ 23 1.1 Chunks 24 1.2 Einige lexikalische Konventionen 26 1.3 Globale Variablen 27 1.4 DerStand-alone-Interpreter 28 2 Typen und Werte 31 2.1 Nil 32 2.2 Boolesche Werte 32 2.3 Zahlen 33 2.4 Strings 33 2.5 Tabellen 37 2.6 Funktionen 40 2.7 Userdata und Threads 41 3 Ausdrücke 43 3.1 Arithmetische Operatoren 43 3.2 Vergleichsoperatoren 44 / 3.3 Logische Operatoren 45 3.4 Zusammensetzung 46 3.5 Vorrang 47 5
iii llll ll llll ^^l^ no ll l n llll^llll 1ll ll^llnl^1^^^^~^i^ *-^^'^,I^^^ HnBBBBi^BIBB 3.6 Tabellenkonstruktoren 47 4 Anweisungen 51 4.1 Zuweisung 51 4.2 Lokale Variablen und Blöcke 53 4.3 Kontrollstrukturen 55 4.3.1 ifthenelse 55 4.3.2 while 55 4.3.3 repeat v... 56 4.3.4 Numerisches for 56 4.3.5 Generisches for 57 4.4 break und return 59 5 Funktionen 61 5.1 Mehrere Ergebnisse 63 5.2 Variable Anzahl von Argumenten 66 5.3 Benannte Argumente 69 6 Mehr über Funktionen 71 6.1 Closures 74 6.2 Nicht-Globale Funktionen 77 6.3 Saubere Tail-Aufrufe 79 7 Iteratoren und das generische for 83 7.1 Iteratoren und Closures 83 7.2 Die Semantik des generischen for 86 7.3 Zustandslose Iteratoren 87 7.4 Iteratoren mit komplexem Zustand 89 7.5 Echte Iteratoren 90 8 Kompilierung, Ausführung und Fehler 93 8.1 Kompilierung 94 8.2 C-Code 97 8.3 Fehler 98 [~6~
8.4 Fehlerbehandlung und Ausnahmen 100 8.5 Fehlermeldungen und Tracebacks 102 9 Koroutinen 105 9.1 Koroutinen-Grundlagen 106 9.2 Pipes und Filter 109 9.3 Koroutinen als Iteratoren 112 9.4 Nieht-Präemptives Multithreading 114 10 Vollständige Beispiele 121 10.1 Datenbeschreibung 121 10.2 Markov-Ketten-Algorithmus 125 11 Tabellen und Objekte 129 11 Datenstrukturen 131 11.1 Arrays 132 11.2 Matrizen und mehrdimensionale Arrays 133 11.3 Verkettete Listen 134 11.4 Queues und doppelte Queues 135 11.5 Mengen und Multimengen 137 11.6 String-Puffer 138 11.7 Graphen 140 12 Datendateien und Persistenz 143 12.1 Datendateien 143 12.2 Serialisierung 146 12.2.1 Tabellen ohne Zyklen speichern 148 12.2.2 Tabellen mit Zyklen speichern 150 13 Metatabellen und Metamethoden 153 13.1 Arithmetische Metamethoden 154 13.2 Vergleichende Metamethoden 157 13.3 Bibliotheksdefinierte Metamethoden 158
itiutaiaiii»bawmbbiaiiim^ 13.4 Metamethoden für den Tabellenzugriff 159 13.4.1 Die Methamethode index 160 13.4.2 Die Metamethode newindex 161 13.4.3 Tabellen mit Vorgabewerten 162 13.4.4 Tabellenzugriffe mitverfolgen 163 13.4.5 Nur-Iesbare Tabellen 165 14 Die Umgebung 167 14.1 Globale Variablen mit dynamischen Namen \.... 168 14.2 Globale Variablendeklarationen 169 14.3 Nicht globale Umgebungen 172 15 Module und Pakete 175 15.1 Die Funktion require 176 15.2 Der grundlegende Ansatz beim Schreiben von Modulen 180 15.3 Umgebungen benutzen 182 15.4 Die Funktion module 184 15.5 Untermodule und Pakete 185 16 Objektorientierte Programmierung 189 16.1 Klassen 191 16.2 Vererbung 193 16.3 Mehrfachvererbung 195 16.4 Kapselung 197 16.5 Der Einmethoden-Ansatz 200 17 Schwache Tabellen 203 17.1 Memoisierungsfunktionen 205 17.2 Objektattribute 207 17.3 Noch einmal zu Tabellen mit Vorgabewerten 208 111 Die Standardbibliotheken 211 18 Die mathematische Bibliothek 213 8
» ^ Inhaltsverzeichnis 19 Die Tabellenbibliothek 215 19.1 Insert und Remove 215 19.2 Sort 216 19.3 Zusammensetzung 218 20 Die String-Bibliothek 219 20.1 Grundlegende String-Funktionen 220 20.2 Funktionen bei Mustervergleichen 222 20.2.1 Die Funktion string.find 222 20.2.2 Die Funktion string.match 223 20.2.3 Die Funktion string.gsub 224 20.2.4 Die Funktion string.gmatch 224 20.3 Muster... 225 20.4 Captures 229 20.5 Ersetzungen 232 20.5.1 URL-Kodierung 233 20.5.2 Tabulator-Expansion 235 20.6 Tipps und Tricks 236 21 Die Ein-/Ausgabe-Bibliothek 241 21.1 Das einfache Ein-/Ausgabe-Modell 242 21.2 Das vollständige Ein-/Ausgabe-Modell 245 21.2.1 Ein kleiner Performance-Trick 246 21.2.2 Binärdateien!.... 247 21.3 Weitere Datei-Operationen 249 22 Die Betriebssystem-Bibliothek 251 22.1 Datum und Zeit 252 22.2 Weitere Systemaufrufe 254 23 Die Debug-Bibliothek 257 23.1 Möglichkeiten der Introspektion 258 23.1.1 Zugriff auf lokale Variablen 260 23.1.2 Zugriff auf nicht-lokale Variablen 261
^^M^^^MpiMIIIMIIlllpilllllllll ll lll»»m««mpm»»»lll«ll»»l»^^ 23.1.3 Zugriff auf andere Koroutinen 263 23.2 Hooks 264 23.3 Profile 264 IV DieC-API 267 24 Eine Übersicht der C-API 269 24.1 Ein erstes Beispiel \.... 271 24.2 Der Stack 273 24.2.1 Elemente ablegen 274 24.2.2 Elemente abrufen 276 24.2.3 Weitere Stack-Operationen 278 24.3 Fehlerbehandlung mit der C-API 280 24.3.1 Fehlerbehandlung in Anwendungscode 280 24.3.2 Fehlerbehandlung in Bibliothekscode 281 25 Erweiterung einer Anwendung 283 25.1 Die Grundlagen 283 25.2 Tabellenmanipulation 285 25.3 Aufruf von Lua-Funktionen 290 25.4 Eine generische Aufruffunktion 291 26 C aus Lua aufrufen 295 26.1 C-Funktionen 296 26.2 C-Module 298 r^ 27 Techniken zum Schreiben von C-Funktionen 301 27.1 Array-Manipulation 301 27.2 String-Manipulation 303 27.3 Zustand in C-Funktionen speichern 306 27.3.1 Das Register 307 27.3.2 Umgebungen für C-Funktionen 309 27.3.3 Upvalues 310
^ Inhaltsverzeichnis 28 Benutzerdefinierte Typen in C 313 28.1 Userdata 314 28.2 Metatabellen 317 28.3 Objektorientierter Zugriff 320 28.4 Array-Zugriff 322 28.5 Leichtgewichtige Userdata 323 29 Ressourcen verwalten 325 29.1 Ein Verzeichnisiterator 326 29.2 Ein XML-Parser 328 30 Threads und Zustände 339 30.1 Mehrere Threads 340 30.2 Lua-Zustände 344 31 Speicherverwaltung 353 31.1 Die Allokierungsfunktion 354 31.2 Die Speicherbereinigung 356 31.2.1 Atomare Operationen 357 31.2.2 API der Speicherbereinigung 358 \ T71