Programming in Lua, Second Edition by Roberto Ierusalimschy
Total Page:16
File Type:pdf, Size:1020Kb
Programming ROBERTO IERUSALIMSCHY in Lua 2nd edition Lua.org Last update: Wed Jan 13 12:07:33 UTC 2010 Programming in Lua Property of Ian Bloss <[email protected]> Property of Ian Bloss <[email protected]> Programming in Lua Second Edition Roberto Ierusalimschy PUC-Rio, Brazil Lua.org Rio de Janeiro Property of Ian Bloss <[email protected]> Programming in Lua, Second Edition by Roberto Ierusalimschy ISBN 85-903798-2-5 Copyright c 2006, 2003 by Roberto Ierusalimschy. All rights reserved. The author can be contacted at [email protected]. Book cover and illustrations by Dimaquina. Lua logo design by Alexandre Nako. Typesetting by the author using LATEX. Although the author used his best efforts preparing this book, he assumes no responsibility for errors or omissions, or for any damage that may result from the use of the information presented here. All product names mentioned in this book are trademarks of their respective owners. CIP – Biblioteca do Departamento de Informatica,´ PUC-Rio Ierusalimschy, Roberto I22 Programming in Lua / Roberto Ierusalimschy. – 2nd ed. – Rio de Janeiro, 2006. xviii, 308 p. : 25 cm. Includes index. ISBN 85-903798-2-5 1. Lua (Programming language). I. Title. 005.133 – dc20 Property of Ian Bloss <[email protected]> to Ida, Noemi, and Ana Lucia Property of Ian Bloss <[email protected]> Property of Ian Bloss <[email protected]> Contents Preface xiii I The Language 1 1 Getting Started 3 1.1 Chunks 4 1.2 Some Lexical Conventions 5 1.3 Global Variables 6 1.4 The Stand-Alone Interpreter 7 2 Types and Values 9 2.1 Nil 10 2.2 Booleans 10 2.3 Numbers 10 2.4 Strings 11 2.5 Tables 13 2.6 Functions 17 2.7 Userdata and Threads 17 3 Expressions 19 3.1 Arithmetic Operators 19 3.2 Relational Operators 20 3.3 Logical Operators 21 3.4 Concatenation 22 3.5 Precedence 22 3.6 Table Constructors 22 vii Property of Ian Bloss <[email protected]> viii Contents 4 Statements 27 4.1 Assignment 27 4.2 Local Variables and Blocks 28 4.3 Control Structures 30 4.4 break and return 34 5 Functions 35 5.1 Multiple Results 36 5.2 Variable Number of Arguments 39 5.3 Named Arguments 42 6 More About Functions 45 6.1 Closures 47 6.2 Non-Global Functions 50 6.3 Proper Tail Calls 52 7 Iterators and the Generic for 55 7.1 Iterators and Closures 55 7.2 The Semantics of the Generic for 57 7.3 Stateless Iterators 58 7.4 Iterators with Complex State 60 7.5 True Iterators 61 8 Compilation, Execution, and Errors 63 8.1 Compilation 63 8.2 C Code 67 8.3 Errors 67 8.4 Error Handling and Exceptions 69 8.5 Error Messages and Tracebacks 70 9 Coroutines 73 9.1 Coroutine Basics 73 9.2 Pipes and Filters 76 9.3 Coroutines as Iterators 79 9.4 Non-Preemptive Multithreading 81 10 Complete Examples 87 10.1 Data Description 87 10.2 Markov Chain Algorithm 91 II Tables and Objects 95 11 Data Structures 97 11.1 Arrays 97 Property of Ian Bloss <[email protected]> ix 11.2 Matrices and Multi-Dimensional Arrays 98 11.3 Linked Lists 100 11.4 Queues and Double Queues 100 11.5 Sets and Bags 101 11.6 String Buffers 103 11.7 Graphs 104 12 Data Files and Persistence 107 12.1 Data Files 107 12.2 Serialization 109 13 Metatables and Metamethods 117 13.1 Arithmetic Metamethods 118 13.2 Relational Metamethods 120 13.3 Library-Defined Metamethods 122 13.4 Table-Access Metamethods 122 14 The Environment 129 14.1 Global Variables with Dynamic Names 129 14.2 Global-Variable Declarations 131 14.3 Non-Global Environments 132 15 Modules and Packages 137 15.1 The require Function 138 15.2 The Basic Approach for Writing Modules 141 15.3 Using Environments 143 15.4 The module Function 144 15.5 Submodules and Packages 145 16 Object-Oriented Programming 149 16.1 Classes 151 16.2 Inheritance 152 16.3 Multiple Inheritance 154 16.4 Privacy 156 16.5 The Single-Method Approach 158 17 Weak Tables 161 17.1 Memoize Functions 163 17.2 Object Attributes 164 17.3 Revisiting Tables with Default Values 165 III The Standard Libraries 167 18 The Mathematical Library 169 Property of Ian Bloss <[email protected]> x Contents 19 The Table Library 171 19.1 Insert and Remove 171 19.2 Sort 172 19.3 Concatenation 173 20 The String Library 175 20.1 Basic String Functions 175 20.2 Pattern-Matching Functions 177 20.3 Patterns 180 20.4 Captures 183 20.5 Replacements 185 20.6 Tricks of the Trade 189 21 The I/O Library 193 21.1 The Simple I/O Model 193 21.2 The Complete I/O Model 196 21.3 Other Operations on Files 199 22 The Operating System Library 201 22.1 Date and Time 201 22.2 Other System Calls 203 23 The Debug Library 205 23.1 Introspective Facilities 205 23.2 Hooks 210 23.3 Profiles 211 IV The C API 215 24 An Overview of the C API 217 24.1 A First Example 218 24.2 The Stack 221 24.3 Error Handling with the C API 225 25 Extending Your Application 229 25.1 The Basics 229 25.2 Table Manipulation 231 25.3 Calling Lua Functions 235 25.4 A Generic Call Function 236 26 Calling C from Lua 241 26.1 C Functions 241 26.2 C Modules 244 Property of Ian Bloss <[email protected]> xi 27 Techniques for Writing C Functions 247 27.1 Array Manipulation 247 27.2 String Manipulation 249 27.3 Storing State in C Functions 251 28 User-Defined Types in C 259 28.1 Userdata 260 28.2 Metatables 262 28.3 Object-Oriented Access 265 28.4 Array Access 267 28.5 Light Userdata 268 29 Managing Resources 269 29.1 A Directory Iterator 269 29.2 An XML Parser 271 30 Threads and States 281 30.1 Multiple Threads 281 30.2 Lua States 285 31 Memory Management 293 31.1 The Allocation Function 293 31.2 The Garbage Collector 295 Index 299 Property of Ian Bloss <[email protected]> Property of Ian Bloss <[email protected]> Preface When Waldemar, Luiz, and I started the development of Lua, back in 1993, we could hardly imagine that it would spread as it did. Started as an in-house language for two specific projects, currently Lua is widely used in all areas that can benefit from a simple, extensible, portable, and efficient scripting language, such as embedded systems, mobile devices, web servers, and, of course, games. We designed Lua, from the beginning, to be integrated with software written in C and other conventional languages. This integration brings many benefits. Lua is a tiny and simple language, partly because it does not try to do what C is already good for, such as sheer performance, low-level operations, and interface with third-party software. Lua relies on C for these tasks. What Lua does offer is what C is not good for: a good distance from the hardware, dynamic structures, no redundancies, ease of testing and debugging. For this, Lua has a safe environment, automatic memory management, and good facilities for handling strings and other kinds of data with dynamic size. A great part of the power of Lua comes from its libraries. This is not by chance. After all, one of the main strengths of Lua is its extensibility. Many fea- tures contribute to this strength. Dynamic typing allows a great degree of poly- morphism. Automatic memory management simplifies interfaces, because there is no need to decide who is responsible for allocating and deallocating memory, or how to handle overflows. Higher-order functions and anonymous functions allow a high degree of parameterization, making functions more versatile. More than an extensible language, Lua is also a glue language. Lua sup- ports a component-based approach to software development, where we create an application by gluing together existing high-level components. These com- ponents are written in a compiled, statically typed language, such as C or C++; Lua is the glue that we use to compose and connect these components. Usually, the components (or objects) represent more concrete, low-level concepts (such as widgets and data structures) that are not subject to many changes during pro- gram development, and that take the bulk of the CPU time of the final program. Lua gives the final shape of the application, which will probably change a lot during the life cycle of the product. However, unlike other glue technologies, Lua is a full-fledged language as well. Therefore, we can use Lua not only to xiii Property of Ian Bloss <[email protected]> xiv Preface glue components, but also to adapt and reshape them, and to create whole new components. Of course, Lua is not the only scripting language around. There are other languages that you can use for more or less the same purposes. But Lua offers a set of features that makes it your best choice for many tasks and gives it a unique profile: Extensibility: Lua's extensibility is so remarkable that many people regard Lua not as a language, but as a kit for building domain-specific languages. Lua has been designed from scratch to be extended, both through Lua code and through external C code. As a proof of concept, Lua implements most of its own basic functionality through external libraries.