Viquipèdia:Lua/Introducció
- Gran part d'aquesta pàgina està basada en la presentació en PDF de Tim Starling al Hackathon 2012 de Berlín.
Benvinguts a la introducció de Lua amb Scribunto, la pàgina d'ajuda per a novells per aprendre a fer scripts Lua a MediaWiki, i un resum per a programadors més avançats.
El contingut està destinat principalment als desenvolupadors familiaritzats amb les plantilles de MediaWiki. Si sou un expert en plantilles MediaWiki, però nouvingut a Lua, aprendreu algunes noves instruccions màgiques. Si teniu experiència amb Lua però no amb plantilles, podeu trobar més informació a Ajuda:Plantilla. Tingueu en compte que algunes coses de Scribunto no s'apliquen en la distribució Lua. Si no sabeu ni una cosa ni l'altre, trobareu que a la comunitat de la Viquipèdia hi ha gent disposada a ajudar-vos.
Introducció per a nous programadors
[modifica]Hola món
[modifica]El primer exercici típic és saber escriure Hola món amb el nou llenguatge. Creeu una pàgina en l'espai de noms Module. El format recomanat per a proves és: Mòdul:Proves/Nom d'usuari. A continuació s'explica en detall el format de Mòdul:Demo:
local p = {} -- Tots els mòduls a la Viquipèdia comencen definint una variable
-- que tindrà totes les funcions accessibles externament
-- S'usa "p" de package (empaquetatge) però pot tenir el nom que vulgueu
function p.hola(frame) -- Afegeix una funció a l'objecte "p"
-- Aquestes funcions es podran invocar en altres pàgines via #invoke
-- "frame" conté les dades que la Viquipèdia envia a aquesta funció
return 'Hola, món!' -- Surt de la funció amb la informació a retornar a la Viquipèdia
end -- Final de la funció "hola"
return p -- Tots els mòduls acaben retornant a la Viquipèdia la variable
-- que conté les funcions
Vegeu més exemples de funcions a Mòdul:Exemple
Podeu executar-lo en una pàgina de la Viquipèdia, cal precedir el nom del mòdul amb #invoke: per exemple en la mateixa pàgina de discussió de proves:
{{#invoke:Exemple|hello}}
Invoca el Mòdul:Exemple i la funció exportada "hello" d'aquest mòdul. Substitueix la invocació pel text retornat per la funció. Típicament les invocacions es faran des d'una plantilla.
Així
{{#invoke:Exemple|hello_to|viquipedista}}
retorna
Hola, viquipedista!
Estructures de control
[modifica]- Vegeu estructures de control
| si ... llavors ... | si ... llavors ... si no ... | si ... llavors ... o si ... si no ... |
if color == 'negre' then
cssColor = '#000'
end
|
if color == 'negre' then
cssColor = '#000'
else
cssColor = color
end
|
if color == 'negre' then
cssColor = '#000'
elseif color == 'blanc' then
cssColor = '#fff'
else
cssColor = color
end
|
Els dos signes == comproven la igualtat. Un sol signe = és per assignar.
f = 1 -- assigna el valor inicial
for i = 1, 5 do
f = f * i
end
return 'El factorial de 5 és ' .. f
Els dos guionets -- són per afegir comentaris. Els dos punts seguits .. són per concatenar.
Tipus de dades
[modifica]- Cadena (string), entre cometes simples ('...') o dobles ("..."). Atenció amb els apòstrofs rectes.
- Numèric, amb punt decimal.
- Booleà: "true" o "false" (verdader o fals)
- "Nil" (nul)
- Taula
- "Function" (funció)
Operadors lògics
[modifica]and: els dos són verdaders
|
or: un o l'altre o tots dos
|
not: el que segueix és fals
|
if torrades and mantega then
return 'esmorçar'
end
|
if pit or cuixa then
return 'dinar'
end
|
if not gana then
return 'dejú'
end
|
Funcions
[modifica]Declaració de funcions:
| sense arguments | amb arguments | funció no local per cridar fora del mòdul |
local function getColour()
return 'blau'
end
|
local function plural(word)
return word .. 's'
end
|
local p = {}
function p.hola()
return 'Hola, món!'
end
return p
|
Per cridar la funció:
colour = getColour()
colorPlural = plural('blau')
Variables
[modifica]Hi ha tres tipus de variables: variables globals, variables locals i taules. Una variable es considera global a no ser que es declari explícitament amb la clau local. Una variable local és visible dins del bloc on ha estat declarada. Una variable declarada sense assignació té el valor nil.
x = 10 -- variable global
do -- nou bloc
local x = x -- nova x assignant el valor de l'anterior
x = x + 1 -- 11
end -- tanca el bloc i les seves variables locals
return x -- 10, la global
|
local x
if ready then
x = 'vés-hi'
end
-- x és 'vés-hi' si
-- ready si no nil
|
Creació d'una taula:
números = {un = 1, dos = 2, tres = 3}
Accés a un element de la taula:
return números.dos -- retorna 2
return números['dos'] -- també retorna 2
Taula numerada:
africanFlatbreads = {
'Aish Mehahra',
'Injera',
'Lahoh',
'Ngome'
}
return africanFlatbreads[2] -- retorna 'Injera'
Iteració dels elements de la taula:
pairs: parell clau/valor en ordre aleatori
|
ipairs: claus numèriques en ordre ascendent
|
for nom, número in pairs(números) do
...
end
|
for index, bread in ipairs(africanFlatbreads) do
...
end
|
Cadenes
[modifica]#, longitud
|
sub, substring
|
s = 'hola'
return #s -- retorna 4
|
s = 'hola'
return s:sub(2,3) -- retorna 'ol'
return s:sub(2) -- retorna 'ola'
return s:sub(-2) -- retorna 'la'
|
Introducció per a programadors
[modifica]Lèxic
[modifica]- El format de comentaris recorda SQL
-- comentari en una única línia
--[[
comentari llarg
--]]
- Els salts de línia són ignorats
- Els punts i comes per acabar les declaracions són opcionals i no recomanats
Tipus de dades
[modifica]- Nil
- Numèrics, un únic format de punt flotant de precisió doble
- Strings, 8-bit
- Booleà
- Funcions
- Valors de primera classe
- Retorna valors múltiples
- Valors de retorn múltiples no estan lligats a un tipus de dada
- Sintaxi anònima
x = function()
...
end
- Taules
- Implementades com a hashtable
- Usades per OOP, com Javascript
- Sintaxi literal:
{nom = valor}o{a, b, c} - Accés amb
foo.barofoo['bar']
Operadors
[modifica]- No igual:
~=en lloc de!= - Concatenació:
.. - Longitud:
# - Lògics:
and,or,not - Exponencial:
^ - Amb el significat habitual:
<,>,<=,>=,==,+,-,*,/,% - Operadors omesos:
- Cap operador d'assignació com
+=. Un sol igual=no és realment un operador. - Cap operador bit a bit
- Cap operador ternari
?:
- Cap operador d'assignació com
- Assignació. Com a BASIC, l'assignació és una declaració completa, no una expressió
| Assignació múltiple | Assignació amb declaració de variable local |
a, b = c, d
a, b = foo()
|
local a, b = c, d
local a = b, c = d -- no així!
|
Estructures de control
[modifica]- Bloc explícit
do
...
end
- Bucles
| Bucle amb condició inicial | Bucle amb condició final |
while cond do
...
end
|
repeat
...
until cond
|
| For numèric | For genèric |
for i = start, stop do
...
end
|
for i in iterator
...
end
|
- La variable d'índex és local del bucle
- If
if cond then
...
elseif cond then
...
else
...
end
Dades
[modifica]- Variables
- Àmbit lèxic, gairebé idèntic a JavaScript
- Una variable no determinada és idèntica a una variable nil
- Cap sintaxi especial per suprimir, simplement
x = nil - Cap error alçat en accedir a una variable no definida
- Cap sintaxi especial per suprimir, simplement
- Objectes
- Fets de taules utilitzant una varietat de sintaxis, similar a JavaScript
- Variables d'elements privats implementades amb àmbit lèxic, com en JavaScript
- Punt per a mètodes estàtics:
obj.func() - Dos punts per a mètodes no estàtics:
obj:func() - Exemple d'estil de construcció d'una funció:
function newObj()
local private = 1
local obj = {}
function obj:getPrivate()
return private
end
return obj
end
- Metataules
- Cada taula pot tenir una metataula associada
- Proporciona sobrecàrrega d'operadors
- El camp index de la metataula s'utilitza per herència d'objectes i programació basada en prototips
Interfície a MediaWiki
[modifica]Tot el codi Lua és en l'espai de noms Module. Hi ha disponible un editor de codi Ace.
Invocació
[modifica]{{ #invoke: nom_mòdul | nom_funció | arg1 | arg2 | nom1 = valor1 }}
Les instàncies d'invocació són aïllades, els globals definits en una no estan disponibles en una altra.
Un mòdul és un bloc Lua que retorna una taula d'exportació. Es proporciona require() i llibreria package. La funció d'exportació retorna una cadena de text wiki, convertint els valors que no siguin string. Els valors múltiples de retorn són concatenats.
Mètodes frame
[modifica]args:
local nom1 = frame.args.nom1
argumentPairs():
local t = {}
for nom, valor in frame:argumentPairs() do
t[name] = value
end
getParent(): Proporciona accés al frame superior, per exemple els arguments de la plantilla que va cridar#invoke- Preprocés de text wiki
frame:preprocess('{{plantilla}}')
- Invocació estructurada de plantilla:
- En cas d'un sol paràmetre posicional:
frame:expandTemplate{
title = 'plantilla',
args = {foo}}
- En cas d'un paràmetre nominatiu (en l'exemple "param"):
frame:expandTemplate{
title = 'plantilla',
args = {param = foo}}
- Els arguments són sempre expandits. No cal construir preprocessar les entrades dels arguments.
Possibilitats de futur
[modifica]- Invocació interwiki de mòduls
- Altres llenguatges diferents a Lua
- Funcions de data i hora
- Accés directe a funcions parser i variables com
{{PAGENAME}},{{#ifexists:}}
Depuració dels mòduls
[modifica]Quan el resultat no és el que esperàvem d'un mòdul que hem creat o retocat, i no acabem de trobar l'error en repassar el codi, llavors caldrà poder veure els valors que prenen algunes variables o el flux del programa (senyalant amb unes etiquetes les línies per on hauria de seguir el flux). Aquest procés de revisió i correcció és el que s'anomena depuració. Aquí esmentarem com es pot revisar el codi.
Revisió simple
[modifica]Quan volem veure el valor d'una variable en un sol punt del mòdul:
- Modificant el codi
Podem utilitzar la funció (per a qualsevol punt del mòdul) error(). Així si volem saber el valor de var, afegirem una línia en el mòdul amb error(var).
Però en el cas que sigui una taula (tab, en el que segueix) haurem d'utilitzar mw.dumpObject(tab) o, si no té taules niuades, també es pot utilitzar table.concat (tab,',') com a paràmetre de la funció error().
- Sense modificar el codi
Per obtenir variables i els valors retornats per funcions (no locals en els dos casos) podem utilitzar la "Consola de depuració" que apareix a baix de tot de la pàgina del mòdul (quan aquest està en mode d'edició). Per a això utilitzarem mw.log i mw.logObject. Vegem la seva utilitat en un exemple descrit a continuació (mòdul que podem trobar aquí):
local p = {}
p.Hola = 'Hola'
function p.calcula(num)
return num
end
function p.sum_mult(num)
return num + num, num * num
end
function p.mtable(num)
return {num, num+1}
end
return p
Peticions a "Consola de depuració":
| Petició | Valor retornat |
|---|---|
| mw.log(p.Hola) | "Hola" |
| mw.log(p.calcula(10/2) | 5 |
| mw.log(p.sum_mult(3))) | 3 9 |
| mw.log(p.mtable(4)) | table |
| mw.logObject(p.table(4)) |
table#1 {
} |
La consola de depuració no desa les peticions i s'han de copiar o reescriure de nou en cada modificació del mòdul.
Revisió del flux i dels valors de les variables en diversos punts
[modifica]Les funcions del Mòdul: SimpleDebug s'utilitzen per a casos com els anteriorment citats o per a casos més complexos:
- Quan una variable o el valor (o valors) retornats per una funció siguin locals.
- Quan interessi els valors que pren una variable (o diverses) en diversos punts (inclosos en mòduls requerits).
- Per veure si el flux del programa passa per un punt (al qual etiquetareu).
- Per limitar el nombre de valors retornats des d'un bucle o establir condicions perquè sigui efectiu el registre de valors.
Per saber-ne més
[modifica]- MediaWiki amb Scribunto:
- mw:Extension:Scribunto/Lua reference manual, manual de Lua amb Scribunto
- mw:Extension:Wikibase Client/Lua, funcions Lua d'accés a dades d'un repositori Wikibase, p. ex. Wikidata.
- mw:Manual:Coding conventions/Lua, convencions de codi Lua.
- Recursos externs: