[[Vorlage(getestet, jammy, focal, bionic)]] {{{#!vorlage Wissen [:Pakete installieren: Installation von Programmen] [:Programme starten: Ein Programm starten] }}} [[Inhaltsverzeichnis()]] [[Bild(lua.gif, 72, align=left)]] [http://www.lua.org Lua] {en} ist eine Programmiersprache, welche sich durch einen besonders kleinen Interpreter auszeichnet. Dies ist dadurch bedingt, dass Lua nicht als "allumfassende" Programmiersprache konzipiert war bzw. ist, sondern als Erweiterung von [wikipedia:C_(Programmiersprache):C] um eine eingebettete Skriptsprache. Es steht jedoch auch ein alleinstehender Lua-Interpreter zur Verfügung. Durch die geringe Größe des Interpreters sind Lua-Skripte auch sehr schnell. Lua unterstützt in erster Linie prozedurale Programmierung, allerdings sind auch andere Programmieransätze inklusive Objektorientierung möglich. Lua bietet trotz der geringen Größe einen vollständigen Satz an "Grundbefehlen", wie man ihn auch von anderen [:Programmiersprache:Programmiersprachen] her kennt. Des Weiteren bietet Lua weitere Annehmlichkeiten moderner Sprachen wie z.B. dynamische Typisierung, einen automatischen Garbage-Collector, Erzeugen eines plattformunabhängigen Bytecodes und Verfügbarkeit für diverse [http://www.lua.org/download.html Plattformen] {en}. Außerdem ist Lua über Module, die [http://www.luarocks.org Luarocks] {en}, erweiterbar. Lua wird von einer Reihe von Projekten / Programmen als Erweiterung eingesetzt. Das bekannteste ist vielleicht [http://www.wow-europe.com/de/index.xml World of Warcraft] {de}, aber auch der Fenstermanager [:Archiv/Ion3:Ion3] oder der Desktop-Kalender [:Rainlendar:] sind über Lua-Skripte erweiterbar. = Installation = Lua ist in mehreren [http://www.lua.org/versions.html Versionen] {en} in den Quellen verfügbar. Es sind Lua 5.0 (nur bis einschließlich Impish 21.10) 5.1, 5.2, Lua 5.3 und Lua 5.4 (ab Impish 21.10) verfügbar. Beispiel für die Paketinstallation von Lua 5.3: {{{#!vorlage Paketinstallation lua5.3, universe }}} Dabei wird sowohl der alleinstehende Interpreter als auch die C-Bibliothek zum Einbinden in eigene Projekt installiert. Andere Lua-Versionen lassen sich entsprechend über die Pakete '''lua50''' (nur bis einschließlich Impish), '''lua5.1''', '''lua5.2''' und '''lua5.4''' (ab Impish) installieren, alle Pakete liegen in dem Universe-Quellen. == weitere Lua-Bibliotheken == Es gibt in den offiziellen Paketquellen, Sektion ''universe'', eine ganze Reihe weiterer Lua-Bibliotheken (z.B. Datenbankanbindungen, Netzwerk- / Webprogrammierung uvm.). Die Paketnamen beginnen alle mit '''lua-''', eine vollständige Übersicht gibt es in der [packages:search?suite=all§ion=all&arch=any&keywords=lua&searchon=names:Paketsuche] {de}. = Nutzung = Eine vollständige Übersicht über die Lua-Befehle findet man im "Lua Reference Manual", [http://www.lua.org/manual/5.2/manual.html#5 Kapitel 5 für Lua 5.2] {en} bzw. [http://www.lua.org/manual/5.3/manual.html#5%20Kapitel%205 Kapitel 5 für Lua 5.3] {en} Wichtig für das Verständnis und den effektiven Einsatz von Lua ist der Datentyp [http://www.lua.org/manual/5.2/manual.html#3.4.9 table] {en}. Hierbei handelt es sich nicht um eine Tabelle im herkömmlichen Sinne, sondern um ein [wikipedia:Assoziatives_Array:]. Lua organisiert sich in großen Teile über tables, auch wenn dies für den Nutzer nicht immer direkt sichtbar ist. Über [http://www.lua.org/manual/5.3/manual.html#2.4 metatables] {en} kann das Verhalten von Lua auch beeinflusst bzw. erweitert werden, allerdings nur über die C-API. == Alleinstehender Interpreter == Der interaktive Interpreter für Lua 5.3 lässt sich über den Befehl {{{#!vorlage Befehl lua5.3 }}} bzw. für Lua 5.2 und kleiner: {{{#!vorlage Befehl lua }}} starten[2]. Man befindet sich nun im interaktiven Modus und kann einzelne Lua-Befehle eingeben. Zeilen können in Lua mit einem Semikolon ``;`` abgeschlossen werden, dies ist aber nicht zwingend erforderlich. Der Interpreter erkennt auch selbstständig, ob eine Zeile in sich abgeschlossen ist (z.B. nach einer Variablen-Deklaration) oder ob noch weitere Zeilen folgen müssen (z.B. nach dem öffnen einer Schleife mit ``for``). Der Prompt im Interpreter ändert sich dann auch von ``>`` auf ``>>``. Möchte man ein Skript direkt mit dem Aufruf des Interpreters ausführen, so lautet der Befehl {{{#!vorlage Befehl lua SKRIPTNAME #bzw. lua5.3 SKRIPTNAME }}} Der Lua-Interpreter kennt einige Optionen, welche in den [:man:Manpages] beschrieben sind. Natürlich können Lua-Skripte auch mit einem passenden Shebang versehen werden, so dass beim Aufruf des Skripts der Interpreter automatisch gestartet wird. Die entsprechende Zeile lautet: {{{#!code lua #!/usr/bin/lua }}} Oder alternativ: {{{#!code lua #!/usr/bin/env lua }}} == Einbindung in C == Um Lua innerhalb von C-Programmen zu nutzen, muss man nur die Bibliothek "lua.h" einbinden. C kann dann Lua-Skripte aufrufen und Lua kann auch C-Funktionen ausführen. Die Kommunikation zwischen C und Lua erfolgt dabei über einen Stack. Eine vollständige Befehlsübersicht der C-API findet man im "Lua Reference Manual", [http://www.lua.org/manual/5.3/manual.html#4 Kapitel 4] {en}. == Beispielskript == Im folgenden ein einfaches, kurzes Beispielskript, was einen kleine Einblick in die Syntax von Lua gewährt. {{{#!code lua require("math") function mal_pi(wert) if type(wert) == "number" then return (wert * math.pi) else return "'" .. wert .. "'" .. " ist keine Zahl - kann nicht mit PI multipliziert werden!" end end tab = {} tab[1], tab[2] = 10, 20 tab["schluessel1"] = "wert1" tab["schluessel2"] = 25 tab[3] = "wert2" tab[4] = 30 print("Schlüssel/Index : Wert") for k,v in pairs(tab) do print(k,":",v) end print("\nMultipliziere PI mit jeder Zahl:") for n,v in ipairs(tab) do x = mal_pi(v) print(x) end -- ein Kommentar :-) }}} Erklärung: * In der 1. Zeile wird das Modul ``math`` geladen (Hinweis: dient hier nur zur Veranschaulichung von ``require``. Das Modul "math" gehört zur Standarddistribution und wird immer automatisch mit geladen). * In den Zeilen 3 bis 9 wird die Funktion ``mal_pi`` definiert. Diese erwartet einen Wert ``wert`` der, falls es eine Zahl ist, mit PI multipliziert wird. * In den Zeilen 11 bis 16 wird der table ``tab`` definiert. Es gibt vier Werte mit numerischem Index und zwei mit einen Schlüssel. * In den Zeilen 19 bis 21 wird über die Schlüssel-Werte Paare von ``tab`` iteriert und das Schlüssel-Werte Paar ausgegeben. * In den Zeilen 25 bis 28 wird über alle Elemente von ``tab`` mit numerischen Index iteriert. Der Wert wird an die Funktion ``mal_pi`` übergeben, dass Ergebnis wird mittels ``print`` ausgegeben. * Zeile 29 enthält einen einzeiligen Kommentar. Die Ausgabe sieht so aus: {{{ Schlüssel/Index : Wert 1 : 10 2 : 20 3 : wert2 4 : 30 schluessel2 : 25 schluessel1 : wert1 Multipliziere PI mit jeder Zahl: 31.415926535898 62.831853071796 'wert2' ist keine Zahl - kann nicht mit PI multipliziert werden! 94.247779607694 }}} = Links = * [http://lua-users.org/ Lua-Users.org] {en} - Lua-Community * [wikipedia_en:Lua_(programming_language):Lua] - enthält viele Code-Beispiele #tag: Programmierung