Klein, schnell und als Skriptsprache eingebettet
Ausführen: Datei hallo.lua speichern und mit lua hallo.lua starten. Online geht es z. B. im Lua Demo (lua.org/demo.html).
nil und false sind falsch.. verkettet, print und io.write geben auslua hallo.lua # Datei
lua -e "print(1 + 2)" # eine Zeile
lua # interaktive Konsolelocal; Konstanten mit <const>// für Ganzzahldivision, ^ Potenz.., #, Methoden wie s:upper(); Bytefolgen (utf8-Bibliothek für Unicode)~=x or standard und bedingung and a or b als Idiomelocal x = 10 -- lokal (im Block gültig): immer bevorzugen
y = 20 -- global (überall sichtbar): meist ein Fehler!
local a, b, c = 1, 2 -- c ist nil
print(x, y, a, b, c)
do
local x = 99 -- eigener Block, verdeckt das äußere x
print(x)
end
print(x)
local PI <const> = 3.14159 -- Konstante (Lua 5.4)
print(PI)
print(undefiniert) -- nicht gesetzte Variablen sind nilif/elseif/else/end, while, repeat/until, numerisches for i = von, bis, schrittcontinue: goto oder verschachtelte if... für variable Argumente, selectlocal punkte = 78
if punkte >= 90 then
print("sehr gut")
elseif punkte >= 75 then
print("gut")
else
print("weiter üben")
end
for i = 1, 3 do io.write(i, " ") end -- 1 bis 3
print()
for i = 10, 1, -4 do io.write(i, " ") end -- Schrittweite -4
print()
for i = 0, 1, 0.25 do io.write(i, " ") end
print()
local n = 3
while n > 0 do io.write(n, " "); n = n - 1 end
print()
local k = 0
repeat k = k + 1 until k >= 3 -- läuft mindestens einmal
print(k)
for i = 1, 10 do
if i % 2 == 0 then goto weiter end -- Lua kennt kein continue, goto ersetzt es
if i > 7 then break end
io.write(i, " ")
::weiter::
end
print()#t gibt die Länge; table.insert/remove/concat/sort/unpackipairs für Listen, pairs für alle Einträge (Reihenfolge nicht garantiert)nil setzen löscht einen Eintraglocal liste = {"Apfel", "Birne", "Kirsche"} -- Schlüssel 1, 2, 3
local person = {name = "Mia", alter = 17} -- Schlüssel "name", "alter"
local gemischt = {10, 20, x = 1, [100] = "hundert", ["mit leer"] = true}
print(liste[1], #liste, person.name, person["alter"], gemischt[100], gemischt["mit leer"])
liste[#liste + 1] = "Dattel" -- anhängen
table.insert(liste, "Erdbeere")
table.insert(liste, 1, "Ananas") -- an Position einfügen
print(table.concat(liste, ", "))
print(table.remove(liste), table.remove(liste, 1)) -- letztes, erstes entfernen
print(table.concat(liste, ", "), #liste)
person.stadt = "Berlin"
person.alter = nil -- löscht den Eintrag
print(person.alter, person.stadt)
print(liste[99], type(liste))%d %a %s %w, Quantoren * + - ?, Captures ( )find (Position), match (Treffer/Captures), gmatch (Schleife), gsub (Ersetzen)% maskieren; find(..., 1, true) sucht ohne Musterutf8-Bibliothek für Unicodelocal text = "Mia (17) wohnt in 10115 Berlin, Tom (25) in 20095 Hamburg."
print(string.find(text, "Berlin")) -- Start- und Endposition
print(string.find(text, "%d+")) -- erste Zahl
print(string.match(text, "%((%d+)%)")) -- Capture: 17
print(string.match(text, "(%a+) %((%d+)%)")) -- Name und Alter
print(string.match("2025-03-15", "(%d+)-(%d+)-(%d+)"))
print((string.gsub(text, "%d%d%d%d%d", "#####"))) -- ersetzen
print(string.gsub("hallo welt", "%w+", string.upper))
print(string.gsub("a b c", " ", "_", 1)) -- höchstens 1 Ersetzung
print(string.gsub("Hallo", "(%a)(%a*)", "%2%1")) -- Rückbezug auf Captures
print(string.gsub("$name ist $alter", "%$(%w+)", {name = "Mia", alter = 17}))
for wort in string.gmatch("eins zwei drei", "%S+") do io.write("[", wort, "]") end
print()
for k, v in string.gmatch("a=1, b=2, c=3", "(%w+)=(%w+)") do io.write(k, "->", v, " ") end
print()
print((" Text "):match("^%s*(.-)%s*$") .. "|") -- trimmen
print(("a,b,,c"):find(",", 1, true)) -- true = einfache Suche ohne Muster__index, __newindex) und Ausgabe (__tostring)__index; Vererbung = Metatabelle der Klasse zeigt auf die Oberklasseobj:methode() übergibt self automatischlocal Vektor = {}
Vektor.__index = Vektor
function Vektor.neu(x, y) return setmetatable({x = x, y = y}, Vektor) end
function Vektor.laenge(v) return math.sqrt(v.x ^ 2 + v.y ^ 2) end
Vektor.__add = function(a, b) return Vektor.neu(a.x + b.x, a.y + b.y) end
Vektor.__mul = function(a, k) return Vektor.neu(a.x * k, a.y * k) end
Vektor.__eq = function(a, b) return a.x == b.x and a.y == b.y end
Vektor.__lt = function(a, b) return a:laenge() < b:laenge() end
Vektor.__tostring = function(v) return "(" .. v.x .. ", " .. v.y .. ")" end
Vektor.__len = function(v) return 2 end
Vektor.__call = function(v, faktor) return v * faktor end
Vektor.__unm = function(v) return Vektor.neu(-v.x, -v.y) end
Vektor.__concat = function(a, b) return tostring(a) .. tostring(b) end
local a, b = Vektor.neu(1, 2), Vektor.neu(3, 4)
print(tostring(a + b), tostring(a * 3), tostring(-a), a == Vektor.neu(1, 2), a < b, #a, tostring(a(10)))
print(a:laenge(), b:laenge(), a .. b)error, pcall, xpcall, assert für Fehler; Rückgabe nil, meldung als Konventionio.open, f:read, f:write, io.lines, immer closerequire lädt einmalcreate/wrap, resume, yield, statuslocal function teile(a, b)
if b == 0 then error("Division durch null") end
return a / b
end
print(pcall(teile, 10, 2))
local ok, meldung = pcall(teile, 1, 0)
print(ok, meldung)
local ok2, fehler = pcall(function() local x = nil; return x.feld end)
print(ok2, fehler)
local ok3, tabelle = pcall(error, {code = 404, text = "nicht gefunden"}) -- beliebige Werte als Fehler
print(ok3, tabelle.code, tabelle.text)
print(select(2, pcall(error, "ohne Position", 0))) -- Level 0: ohne Quelltextposition
print(pcall(assert, false, "Assertion fehlgeschlagen"))
print(pcall(assert, 1 == 1, "nie sichtbar"))
local function mit_traceback()
return xpcall(function() error("tief unten") end, function(m) return "behandelt: " .. m end)
end
print(mit_traceback())
local f, err = io.open("/gibt/es/nicht.txt", "r") -- viele Funktionen liefern nil, Fehlertext
print(f, err)
print(tonumber("x"), tostring(nil))local verwenden, Indizes ab 1, ~= für ungleich// C-Seite (Prinzip)
lua_State *L = luaL_newstate();
luaL_openlibs(L);
lua_register(L, "spiele_sound", meine_c_funktion);
luaL_dofile(L, "level1.lua");
lua_close(L);