Choose a language it

Programmare in Lua

Introduzione

In questo capitolo parleremo della programmazione in Lua, degli strumenti necessari, e tratteremo alcune tecniche che troverai probabilmente utili.

Programmare

Programmare è l’azione di prendere un problema, come ordinare una lista di oggetti, e tramutarlo in dei passaggi che il computer può comprendere.

Insegnarti i processi logici della programmazione non rientra nell’ambito di questo libro; tuttavia, i seguenti siti sono alquanto utili per approfondire l’argomento:

  • Codecademy è una delle migliori risorse per imparare come scrivere codice; offre un’esperienza guidata interattiva.
  • Scratch è una buona risorsa quando si comincia dalle basi assolute, imparando le tecniche di problem solving necessarie per la programmazione.
    Scratch è ideato per insegnare ai bambini e non è un linguaggio serio di programmazione.
  • Programming with Mosh is a good YouTube series to learn programming.

Programmare in Lua

Neanche insegnarti come programmare in lua rientra nell’ambito di questo libro. Tuttavia, se mastichi l’inglese puoi rifarti a quest’altro libro, “Programming in Lua”, per un’eccellente infarinatura sull’argomento. Se invece l’inglese non è il tuo forte, troverai comunque svariate guide in italiano in giro per la rete.

Editor di codice

Un editor di codice con evidenziamento delle parole chiave è sufficiente per scrivere script in Lua. L’evidenziamento assegna colori diversi a parole e caratteri diversi, a seconda del loro significato, permettendo quindi di individuare più facilmente eventuali errori e inconsistenze.

Per esempio:

function ctf.post(team,msg)
    if not ctf.team(team) then
        return false
    end
    if not ctf.team(team).log then
        ctf.team(team).log = {}
    end

    table.insert(ctf.team(team).log,1,msg)
    ctf.save()

    return true
end

Nel passaggio qui sopra, le parole chiave if, then, end e return sono evidenziate. E Lo stesso vale per le funzioni interne di Lua come table.insert.

Tra gli editor più famosi che ben si prestano a lavorare in Lua, troviamo:

(ne esistono ovviamente anche altri)

Portata locale e globale

L’essere locale o globale di una variabile determina da dove è possibile accederci. Una variabile locale è accessibile soltanto da dove viene definita. Ecco alcuni esempi:

-- Accessibile dall'interno dello script
local one = 1

function myfunc()
    -- Accessibile dall'interno della funzione
    local two = one + one

    if two == one then
        -- Accessible dall'interno del costrutto if
        local three = one + two
    end
end

Mentre le variabili globali sono accessibili da qualsiasi script di qualsiasi mod.

function one()
    foo = "bar"
end

function two()
    print(dump(foo))  -- Output: "bar"
end

one()
two()

Precedenza alla portata locale

Le variabili locali dovrebbero venire usate il più possibile, con le mod che creano al massimo una globale corrispondente al nome della mod. Crearne di ulteriori è considerato cattiva programmazione, e Minetest ci avviserà di ciò:

Assignment to undeclared global 'foo' inside function at init.lua:2

Per ovviare, usa local:

function one()
    local foo = "bar"
end

function two()
    print(dump(foo))  -- Output: nil
end

one()
two()

Ricorda che nil significa non inizializzato. Ovvero la variabile non è stata ancora assegnata a un valore, non esiste o è stata deinizializzata (cioè impostata a nil)

La stessa cosa vale per le funzioni: esse sono variabili di tipo speciale, e dovrebbero essere dichiarate locali, in quanto altre mod potrebbero sennò avere funzioni con lo stesso nome.

local function foo(bar)
    return bar * 2
end

Per permettere alle mod di richiamare le tue funzioni, dovresti creare una tabella con lo stesso nome della mod e aggiungercele all’interno. Questa tabella è spesso chiamata una API.

mymod = {}

function mymod.foo(bar)
    return "foo" .. bar
end

-- In un'altra mod o script:
mymod.foo("foobar")

Inclusione di altri script Lua

Il metodo consigliato per includere in una mod altri script Lua è usare dofile.

dofile(core.get_modpath("modname") .. "/script.lua")

Uno script può ritornare un valore, che è utile per condividere variabili locali private:

-- script.lua
return "Hello world!"

-- init.lua
local ret = dofile(core.get_modpath("modname") .. "/script.lua")
print(ret) -- Hello world!

Nei capitoli seguenti si parlerà nel dettaglio di come suddividere il codice di una mod.