sehr empfehlenswert
Die Einführung in die Scriptsprache Lua; konzis, vollständig und gute Beispiele.
Die Scriptsprache Lua existiert seit 1994. Sie ist in ANSI-C (C89) geschrieben und daher hochportabel. Die grundlegende Datenstruktur ist die Table, ein assoziatives Array, wobei atomare Werte, Strings und Objekte als Keys erlaubt sind. Diese Eigenschaft eröffnet viele interessante Möglichkeiten. Die Sprache unterstützt anonyme Funktionen (Lambda-Expressions) und Closures mit Lexical Scoping.
Die Lua Autoren haben grossen Wert auf Portabilität und möglichst kurzen Code gelegt. Dies erleichter die Portierung, Anpassung und Erweiterung von Lua. Lua ist vor allem bei Spielen als Scripting-Engine beliebt.
Das Buch führt (dem K&R nicht unähnlich) in vielen kurzen Kapiteln alle Eigenschaften der Sprache und ihrer Implementation ein, es ist somit eine Einführung und ein Rationale. Die Sprachreferenz ist als ein zweiter Band ebenfalls erhältlich.
Preface Part I. The Language 1 Getting Started 1.1 Chunks 1.2 Global Variables 1.3 Some Lexical Conventions 1.4 The Stand-Alone Interpreter 2 Types and Values 2.1 Nil 2.2 Booleans 2.3 Numbers 2.4 Strings 2.5 Tables 2.6 Functions 2.7 Userdata and Threads 3 Expressions 3.1 Arithmetic Operators 3.2 Relational Operators 3.3 Logical Operators 3.4 Concatenation 3.5 Precedence 3.6 Table Constructors 4 Statements 4.1 Assignment 4.2 Local Variables and Blocks 4.3 Control Structures 4.3.1 if then else 4.3.2 while 4.3.3 repeat 4.3.4 Numeric for 4.3.5 Generic for 4.4 break and return 5 Functions 5.1 Multiple Results 5.2 Variable Number of Arguments 5.3 Named Arguments 6 More about Functions 6.1 Closures 6.2 Non-Global Functions 6.3 Proper Tail Calls 7 Iterators and the Generic for 7.1 Iterators and Closures 7.2 The Semantics of the Generic for 7.3 Stateless Iterators 7.4 Iterators with Complex State 7.5 True Iterators 8 Compilation, Execution, and Errors 8.1 The require Function 8.2 C Packages 8.3 Errors 8.4 Error Handling and Exceptions 8.5 Error Messages and Tracebacks 9 Coroutines 9.1 Coroutine Basics 9.2 Pipes and Filters 9.3 Coroutines as Iterators 9.4 Non-Preemptive Multithreading 10 Complete Examples 10.1 Data Description 10.2 Markov Chain Algorithm Part II. Tables and Objects 11 Data Structures 11.1 Arrays 11.2 Matrices and Multi-Dimensional Arrays 11.3 Linked Lists 11.4 Queues and Double Queues 11.5 Sets and Bags 11.6 String Buffers 12 Data Files and Persistence 12.1 Serialization 12.1.1 Saving Tables without Cycles 12.1.2 Saving Tables with Cycles 13 Metatables and Metamethods 13.1 Arithmetic Metamethods 13.2 Relational Metamethods 13.3 Library-Defined Metamethods 13.4 Table-Access Metamethods 13.4.1 The __index Metamethod 13.4.2 The __newindex Metamethod 13.4.3 Tables with Default Values 13.4.4 Tracking Table Accesses 13.4.5 Read-Only Tables 14 The Environment 14.1 Accessing Global Variables with Dynamic Names 14.2 Declaring Global Variables 14.3 Non-Global Environments 15 Modules and Packages 15.1 The require Function 15.2 The Basic Approach for Writing Modules 15.3 Using Environments 15.4 The module Function 15.5 Submodules and Packages 16 Object-Oriented Programming 16.1 Classes 16.2 Inheritance 16.3 Multiple Inheritance 16.4 Privacy 16.5 The Single-Method Approach 17 Weak Tables 17.1 Memoize Functions 17.2 Object Attributes 17.3 Revisiting Tables with Default Values Part III. The Standard Libraries 18 The Mathematical Library 19 The Table Library 19.1 Insert and Remove 19.2 Sort 19.1 Concatenation 20 The String Library 20.1 Basic String Functions 20.2 Pattern-Matching Functions 20.3 Patterns 20.4 Captures 20.5 Replacements 20.6 Tricks of the Trade 21 The I/O Library 21.1 The Simple I/O Model 21.2 The Complete I/O Model 21.2.1 A Small Performance Trick 21.2.2 Binary Files 21.3 Other Operations on Files 22 The Operating System Library 22.1 Date and Time 22.2 Other System Calls 23 The Debug Library 23.1 Introspective Facilities 23.1.1 Accessing Local Variables 23.1.2 Accessing Upvalues 23.2 Hooks 23.3 Profiles Part IV. The C API 24 An Overview of the C API 24.1 A First Example 24.2 The Stack 24.2.1 Pushing Elements 24.2.2 Querying Elements 24.2.3 Other Stack Operations 24.3 Error Handling with the C API 24.3.1 Error Handling in Application Code 24.3.2 Error Handling in Library Code 25 Extending your Application 25.1 The Basics 25.2 Table Manipulation 25.3 Calling Lua Functions 25.4 A Generic Call Function 26 Calling C from Lua 26.1 C Functions 26.2 C Libraries 27 Techniques for Writing C Functions 27.1 Array Manipulation 27.2 String Manipulation 27.3 Storing State in C Functions 27.3.1 The Registry 27.3.2 Environments for C functions 27.3.3 Upvalues 28 User-Defined Types in C 28.1 Userdata 28.2 Metatables 28.3 Object-Oriented Access 28.4 Array Access 28.5 Light Userdata 29 Managing Resources 29.1 A Directory Iterator 29.2 An XML Parser 30 Threads and States 30.1 Multiple Threads 30.2 Lua States 31 Memory Management 31.1 The Allocation Function 31.2 The Garbage Collector Index
Trotz der Tatsache, dass der Autor Brasilianer und damit kein 'native englisch speaker' ist, ist der Stil einfach, klar und verständlich. Nur an ganz wenigen Stellen werden unübliche Redewendungen verwendet.
Das Buch beantwortet folgende Fragen:
Zum ersten Mal bin ich 1996 durch einen Artikel in der DDJ auf Lua aufmerksam geworden ( http://www.lua.org/ddj.html ), konnte mich aber nie dazu durchringen, mehr mit der Sprache zu machen. Erst das Buch ProgrammingInLua (für 5.0 und 5.1) hat mich bewogen, mich genauer mit der Sprache zu beschäftigen. Ich lese eben lieber Bücher als Websites und (selbstausgedruckte) PDFs.
Lua ist eine interessante, kleine Sprache. Vom Ansatz her, als Sprache in eine Applikation eingebettet zu werden, ist sie Tcl nicht unähnlich. Aber durch die Table-Datenstruktur ist Lua angenehmer zu verwenden (als Tcl mit Listen). Auch scheint mir die API zur Anbindung einiges bequemer als bei Tcl (man muss sich beispielweise nicht selber mit Referencecounting herumschlagen). Die bewusste Einschränkung auf ANSI-C (und eine möglichst kurze Implementation) hat auch Konsequenzen, so werden viele Betriebssystemfunktionen nur über Drittmodule angeboten. Die Regex-Implementation ist ebenfalls selbstgemacht und anders als POSIX, Perl oder Tcl regex, hier muss man sich umgewöhnen. Aber die Table-Datenstruktur, die Booleans, Numbers, Strings und Tables als Keys zulässt ist bemerkenswert und sehr leistungsfähig.
Das Indices (wie bei AWK auch) bei 1 beginnen, halte ich zwar für einen Fehler, aber damit kann und muss man wohl leben.
Da der Autor das Buch selbst in Latex gesetzt hat, ist der Satz optisch sehr ansprechend.
Roberto Ierusalimschy
2006, Eigendruck, ISBN 85-903798-2-5, 307 Seiten
Amazon: http://www.amazon.de/exec/obidos/ASIN/8590379825/lua-home-20
Verlag: http://www.lua.org/pil2/ http://www.lua.org/pil/
Scriptsprache, Lua, Tcl, Language
19-Apr-2007