Lua ist eigentlich keine objektorientierte Programmiersprache, aber mit Hilfe der Tabellen kann man Klassen nachbilden. Das Beispiel in Listing 4 zeigt, dass mit Point = {} eine Tabelle erzeugt wird, die die Klasse Point darstellen soll. Die drei Funktionen new(), __add() und tostring() werden der Tabelle Point zugewiesen, wobei der jeweilige Index gleich dem Funktionsnamen ist.
Der „:“ bei Point:new(x, y) und Point:tostring() bewirkt, dass die Funktion einen versteckten Parameter self (entspricht this in C++) hat. Die Funktion new() erzeugt eine neue Tabelle mit den Feldern x und y und gibt diese Tabelle zurück. Der neuen Tabelle wird die Tabelle Point als Metatabelle hinterlegt. Wenn die beiden Punkte a und b addiert werden, schaut der Interpreter in der Metatabelle nach, ob eine Funktion __add() vorhanden ist, und ruft diese dann auf. Auf diese Weise kann der Operator „+“ überladen werden.
Die Lua-Standard-Bibliotheken bieten sehr nützliche Funktionen, die über das C-Programmier-Interface implementiert sind und als separate C-Module zur Verfügung stehen. Obwohl Erweiterungen in Lua selbst implementiert werden könnten, bietet eine Implementierung in C verschiedentlich Performance-Vorteile. Gegenwärtig bietet Lua Standard-Bibliotheken für:
Lua wurde vom Anfang an entworfen, um erweitert zu werden. Daher ist es sehr einfach, den Leistungsumfang von Lua zu erweitern. Die Sprache bietet dafür ein universelles C-Interface an. Mit der Präprozessor-Anweisung #include "luaxlib.h" werden dem Compiler alle Lua-Definitionen bekannt gemacht. Alle Funktionen, die in C implementiert werden, haben als Parameter einen Zeiger auf den aktuellen Lua-Interpreter. Alle Variablen, die einer Lua-Funktion übergeben werden, werden auf den Lua-Stack kopiert.
zeigt einige Quelltext-Zeilen, aus denen eine Lua-Erweiterung besteht. Die Funktion lua_get-top() liefert die Anzahl der Werte auf dem Stack zurück. Mit der Funktion luaL_checknumber(L, i) kann auf das i-te Element des Lua-Stacks zugegriffen werden. Gleichzeitig überprüft die Funktion luaL_checknumber(), ob der Wert auf dem Stack eine Zahl ist bzw. in eine Zahl konvertiert werden kann. Das Resultat der Berechnung wird mit der Funktion lua_pushnumber() wieder auf den Stack kopiert. Diese Funktion hat als Returnwert die Anzahl Elemente, die auf den Stack kopiert wurden (hier also 1).
Alle Funktionen einer neuen Lua-Bibliothek werden in einer Liste mit Funktionsnamen und dazugehöriger C-Funktion abgelegt. Die Liste wird mit einem NULL-Eintrag beendet (Zeile 12 in ). Jede Bibliothek muss eine Funktion exportieren, die luaopen_NAME() heißt.
In dieser Funktion wird die Liste mit den neuen Funktionen beim Lua-Interpreter registriert.
Die neue Bibliothek wird unter Linux mit gcc -I~/lua-5.1.3/ mylib.c -o mylib.so -shared in eine Programmbibliothek compiliert. Beim Start des Lua-Interpreters ist die neue Bibliothek dem Interpreter noch nicht bekannt. Die Bibliothek muss zuerst mit dem Befehl require("mylib") geladen werden. Jetzt kann die neue Bibliothek verwendet werden: Im Argument der Funktion sum() sind alle Typen enthalten, die Lua als Zahl interpretiert oder in eine Zahl konvertiert.