Kurz: Das Einbetten in C ist Luas ursprünglicher Zweck: Die Host-Anwendung stellt Funktionen bereit, Nutzer skripten das Verhalten.
Teil des Kurses Lua
Wo Lua zu Hause ist
| Bereich | Beispiel |
|---|---|
| Spiele | Roblox (Luau), Love2D, Defold, Solar2D, Garry’s Mod, World of Warcraft-Addons |
| Editoren | Neovim (Konfiguration und Plugins), Wireshark |
| Server | OpenResty/nginx, Redis (Skripte), Kong |
| Eingebettet | Router, Embedded-Geräte, Adobe Lightroom |
Das Einbetten in C ist Luas ursprünglicher Zweck: Die Host-Anwendung stellt Funktionen bereit, Nutzer skripten das Verhalten.
// 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);Love2D: ein Spiel in wenigen Zeilen
-- main.lua
local spieler = {x = 100, y = 100, tempo = 200}
function love.update(dt)
if love.keyboard.isDown("right") then spieler.x = spieler.x + spieler.tempo * dt end
if love.keyboard.isDown("left") then spieler.x = spieler.x - spieler.tempo * dt end
end
function love.draw()
love.graphics.rectangle("fill", spieler.x, spieler.y, 32, 32)
love.graphics.print("Pfeiltasten bewegen den Block", 10, 10)
endNeovim konfigurieren
-- ~/.config/nvim/init.lua
vim.opt.number = true
vim.opt.tabstop = 4
vim.g.mapleader = " "
vim.keymap.set("n", "<leader>w", ":w<CR>", { desc = "Speichern" })
vim.api.nvim_create_autocmd("BufWritePre", {
pattern = "*.lua",
callback = function() vim.lsp.buf.format() end,
})Standardbibliothek im Überblick
| Bibliothek | Wichtige Funktionen |
|---|---|
string | len sub upper lower find match gmatch gsub format rep reverse byte char |
table | insert remove concat sort unpack pack move |
math | floor ceil sqrt abs max min random randomseed pi huge tointeger type |
os | time date clock getenv remove rename tmpname exit |
io | open read write lines close |
utf8 | char codepoint len codes offset |
coroutine | create resume yield status wrap isyieldable |
| Global | print type tostring tonumber pairs ipairs next select assert error pcall xpcall setmetatable getmetatable require load |
math.randomseed(42)
local z = math.random(1, 6)
print(z >= 1 and z <= 6, math.random() < 1, math.huge > 1e308, -math.huge)
print(os.getenv("GIBT_ES_NICHT_12345"), os.clock() >= 0, type(os.time()))
print(load("return 1 + 2")())
print(select("#"), #arg >= 0)Ausgabe:
true true true -inf
nil true number
3
0 trueLeistung und Werkzeuge
- LuaJIT: sehr schneller JIT-Compiler (Lua 5.1-kompatibel), z. B. in OpenResty
- Luau: Roblox’ Variante mit Typannotationen
- LuaRocks: Paketmanager (
luarocks install lpeg) - busted, luaunit: Tests; luacheck: Linter; StyLua: Formatierer
- Messen:
os.clock(); Tabellen vorab dimensionieren (table.move), Schleifen lokal halten
Häufige Fehler
| Problem | Ursache / Lösung |
|---|---|
attempt to index a nil value | Variable oder Feld ist nil: vorher prüfen (t and t.x) |
attempt to perform arithmetic on a nil value | nicht initialisierte Variable |
attempt to compare number with nil | gleiche Ursache beim Vergleichen |
| Variable “verschwindet” | fehlendes local macht sie global (oder umgekehrt) |
#t liefert falsche Länge | Tabelle mit Lücken (nil-Werte); Lua garantiert dann nichts |
Reihenfolge bei pairs wechselt | pairs ist ungeordnet: Schlüssel sortieren |
!= funktioniert nicht | richtig ist ~= |
| Listen starten bei 0 | in Lua bei 1 |
Weiterlernen
- Programming in Lua (Roberto Ierusalimschy, online frei: lua.org/pil)
- Referenzhandbuch lua.org/manual
- Love2D-Wiki (love2d.org), Neovim-Dokumentation
:help lua-guide - Übungen: Exercism (Lua-Track), Advent of Code
Merke
- Lua = Tabellen + Funktionen + Coroutinen, in wenigen Seiten erlernbar
localverwenden, Indizes ab 1,~=für ungleich- Metatabellen ermöglichen OOP, Operatoren und Standardwerte
- Einsatz in Spielen, Neovim, nginx, Embedded
Quiz zur Selbstkontrolle
Was ist LuaRocks?
- Der Paketmanager für Lua (richtig)
- Ein Spiel
- Ein Editor
- Ein Compiler
Wofür steht LuaJIT?
- Ein sehr schneller JIT-Compiler für Lua (richtig)
- Ein Texteditor
- Ein Webserver
- Ein Datenbanktreiber
Wie wird die Länge einer Liste bestimmt?
- #liste (richtig)
- liste.length
- len(liste)
- liste.size()
Weiter im Kurs
Zurück: Fehler, Module und Coroutinen
Alle Kapitel: Lua im Überblick