Helpo:Lua/Programado

El Vikipedio, la libera enciklopedio
Logo de la Lua-lingvo Lua

VP:LUA

Kategorioj
Ŝablonoj
  • {{LuaModuleDoc}} por la dokumentado de modulo, por aranĝi la keston kun ligiloj
  • {{Modula statuso}} por la dokumentadoj de modulo, por indiki la evoluan statuson de modulo
  • {{Kun Lua-modulo}} por la dokumentado de ŝablono, kiu uzas Lua-modulon aŭ eĉ entute baziĝas sur modulo
  • {{Uzanto Projekto/Lua}} por uzantopaĝoj
Vidu ankaŭ
Komentoj
  1. (per {{Kun Lua-modulo}})
  2. (per {{LuaModuleDoc}})
vdr

Ĉi tiu paĝoj informas Lua-programmistojn pri kelkaj apartaĵoj de la lingvo, kiuj ne aŭ nur kaŝe estas prezentataj en la Scribunto-Tutorialo.

Krome ekzistas kelkaj helpopaĝoj pri kromtemoj:

Bibliotekoj[redakti | redakti fonton]

  • Parto de la lingvo Lua estas kelkaj normaj bibliotekoj. Tiom ili en la kunteksto de la Vikiaj paĝoj estas sencoplenaj, ili estas subtenataj.
  • Krome Scribunto ofertas kiel objekton mw (por MediaWiki) kelkajn Viki-specifajn bibliotekojn, kiuj ankaŭ bone kooperas kun la cetera arkitekturo de Vikia servilo.
Lua-baza lingvaĵo
debug
  • debug.traceback
math – matematikaj funkcioj → Scribunto
os
package – ŝarĝado de moduloj → Scribunto
stringsignoĉenoj
table → Scribunto
mw (por „MediaWiki“) – Scribunto-bibliotekoj
frame-objektointerfaco por la ŝablona programado
mw.languageStrukturi en la aktuala homa lingvo
mw.messageSistemaj mesaĝoj
mw.siteaktuala Vikia projekto
mw.textsignoĉenoj
mw.titleVikiaj paĝoj
mw.uriURL
mw.ustringsignoĉenoj en Unikodo
Ŝarĝeblaj Bibliotekoj
prefere pli malofte necesaj → Scribunto
bit32
libraryUtil
luabit
ustring

Erarmesaĝoj[redakti | redakti fonton]

Estas kvar kaŭzoj por skriptaj eraroj:

  1. Sintaksaj eraroj
  2. Programadaj eraroj zur Einbindung
  3. Mankanta paĝo
  4. Eraro de uzanto dum enplektado

Per si mem Lua eldonas ĉe tio ĉiam nur unuopan erarmesaĝon: „skripteraro“. Tio estas enua kaj helpas al neniu ĉe la korektado. Krome estas plenigata la Kategorio:Paĝoj kun skripteraroj, tiel ke ankaŭ ne plu eblas superrigardi, kiu modulo kaŭzis eraron sur la tie listigitaj paĝoj.

Sintaksaj eraroj[redakti | redakti fonton]

Sintaksaj eraroj estas ofte trivialaj skriberaroj. Tiu fakte devus kaŭzi, ke la konservado de la modul-paĝo ne eblas; escepte se oni donus al la kampo „⧼scribunto-ignore-errors⧽“ hoketon.

Ĉe la montrado de la paĝa antaŭrigardo de la modulo oni ricevas laŭeble kvalifikitan erarmesaĝon kune kun la linia numero. Ĉe gravas sintaksaj problemoj tio tamen ne povas esti farata kaj venas la lakona „skripteraro“.

Tipa kvalifikebla eraro estus unuopa punkto anstataŭ du por kunĉenado de signoĉenoj (PHP-stilo). Sen konkreta dono de helpo tamen restas mankanta thenend sed ankaŭ ne fermita signoĉeno.

Programadaj eraroj ĉe enplektado[redakti | redakti fonton]

Se pro la programa strukturo en kelkaj kazoj estiĝas netaŭgaj datumtipoj, en kelkaj ne, tio estas malfacile trovebla. Se tiam ekzemple oni provas, apliki al nil signoĉenan funkcion, tio redonas la konatan nedifinitan eraron. Por la enplektanto de ŝablono tio ne estas solvebla. Laŭeble ĉiuj padoj tial estu traludataj sur testopaĝoj, kaj la kondiĉoj rilate la datumtipon kaj aron de valoroj estu kontrolataj en la funkcioj.

Mankanta paĝo[redakti | redakti fonton]

Se paĝo estas transkludata, povas esti, ke ĉi tiu paĝonomo ne ekzistas; precipe la atendata paĝo estis alinomigita aŭ ĉe la komponado de kunmetita nomo okazis eraro. Por povi solvi ĉi tiun situacion, estas bezonata preciza informo, kiu paĝo mankas. LuaWiki.transclude() ebligas certan enplektadon kaj zorgas por preciza erarmesaĝo.

Eraro de uzanto ĉe la enplektado[redakti | redakti fonton]

Kion ajn la ŝablonaj programistoj kaj enplektistoj de ŝablono enmetas kiel parametrojn, devas esti analizata kaj ĉe problemoj esti provizata kun konkreta mesaĝo, por ke korektado ebliĝu.

Defensiva programado estas konsilinda.

  • Ĉiu enmetaj valoroj estas kiel eble mankantaj aŭ sintakse malĝustaj rigardata, ĝis kiam la malo estis konstatita.
  • Efektive ĉeestantaj parametroj en #invoke estas almenaŭ ĉiam de la tipo string.

Helpaj funkcioj[redakti | redakti fonton]

pcall()
Kraŝosekura ekzekutado de funkcio fun kun parametra listo args.
e, v = pcall( fun, args )
Ĉe tio e estas en kazo de eraro false kaj v la erarmesaĝo.
Se neniu problemo aperis, tiam e havas la valoron true kaj v krom ĉiuj sekvaj variabloj estas la kutimaj redonaj valoroj de fun.
pcall staras por protected call.
Tio respondas al catch.
assert()
assert( v, message, ... )
Kaŭzu skriptan interrompon kun kvalifikata erarmesaĝo, se kondiĉo ne estas plenumata.
Respondas proksimume al error(), sed nur, se la kondiĉo v ne estas plenumata (do estas nilfalse).
Kiel message estu kundonata specifa erarmesaĝo; alie estus lapidara assertion failed! – almenaŭ ĉiam estas montrata la linia numero de la assert en la mesaĝo, krom la nomo de la modulo.
Se v ne estas nil nek false, ĉiuj argumentoj inklude de v kaj message estas redonataj.
La alvoko estas sencoplena nur ene de ĉirkaŭaĵo protektata per pcall(); alie estas kaŭzata nur ĝenerala „skripteraro“ sen pliaj detaloj.
Senco de la afero estas, doni en pli profunda ebeno de la funkcia hierarkio por v funkcion, kiu kontrolas la validecon de la transdonita al ĝi valoroj. Ĉe malfunkcio estas saltata rekte en la ebenon kun pcall(); ekzemple la interfaco al #invoke. Per tio oni ŝparas al si la transdonon de specifaj redonaj valoroj de funkcio al funkcio.
La funkcio respondas al throw.
error()
Ĉi tiu funkcio ebligu skriptan interrompon kun kvalifikita erarmesaĝo.
error( message, level )
La alvoko estas nur sencoplena ene de ĉirkaŭaĵo protektata per pcall(); alie estas nur kaŭzata ĝenerala „skripteraro“ sen pliaj detaloj.
Ene de la funkciaro eliĝanta de pcall() estas redonata la erarmesaĝo message.
La nedeviga parametro level estas en la origina lingvo Lua alvoka sekvo aŭ stack, kies montrenda profundo povas esti difinata.
  • Nuntempe en Scribunto estas montrataj nur la nomo de la modulo kaj la linia numero, kaj tio nur sur unu ebeno. Tio estas eble ankoraŭ ne finita situacio. La konstruo de Vikiaj paĝoj kaj la certa traktado de Lua-dosieroj estas iomete malsamaj.
  • Se level ne estas donata aŭ estas nulo aŭ tro granda, tiam ne estas montrata informo pri la loko.
  • Rekomendas nuntempe, doni level ĉiam kun 1 aŭ tute ne.
La baza ideo similas al tiu de assert().
La funkcio respondas al throw.
LuaWiki.*
Alvokoj de la Vikia ĉirkaŭaĵo.
Ĉi tiu funkcio analizas la transdonitajn parametrojn kaj zorgas por preciza erarmesaĝo.

Malplenaj valoroj[redakti | redakti fonton]

Alie ol ĉe aliaj programadaj lingvoj validas en la C-tradicio:

  • La malplena signoĉeno "" estas „io“.
  • Nur nil kaj false kaj la numero 0 estas „nenio“.
  • Malplena table {} estas samsignifa kun nil.

Tio estas antaŭ ĉio grava por if-informpetoj.

Table kaj objekt[redakti | redakti fonton]

Al valoroj kaj funkcioj kiel komponaĵo de table estas alirataj per . kiel t.k, krom la notado t["k+"] ankaŭ por nomoj de komponaĵoj, kiuj ne estas pure alfanumeraj.

Ĉe objekto (instanco, per biblioteko ofertata de Lua aŭ Scribunto) estas alirata al trajtoj same per .. Por funkcioj (metodoj) estu uzata male :. Ekzemplojn vidu String-funkcioj.

La notado per duobla punkto ne validas nur por Lua- kaj Scribunto-objektoj, sed ankaŭ por uzantodifinitaj objektoj. Ĉe tio la metodo implicite ricevas aldonan parametron self, al kiu povas alirata ene de la metodo. Ĉi tiu reprezentas la instancon de la objekto-table, dum ke la table respondus al „klaso“. La du instrukcioj

function meinObjekt:f ( params ) body end

kaj

meinObjekt.f = function ( self, params ) body end

estas ekvivalentaj.

Ĉe funkcioj en objektoj (metodoj) krome estas la eblo, uzi nomitajn argumentojn. Anstataŭ rondaj krampoj tiam estu uzataj kunigaj krampoj {}. Ĉi tiu formato estas plej ofte aldona opcio; en kelkaj kazoj kiel ĉe [[../Modulo en Vikio#expandTemplate{}|frame:expandTemplate{}]] sed la ununura subtenata aliro.

or: De maldekstre dekstren[redakti | redakti fonton]

Trajto de la or-operatoro, kiu oni povas utiligi al si por la subteno de la ŝablona programado, estas la cirkonstanco, ke ĝi redonas la maldekstre starantan disjunkcian esprimon, se tiu ne estas nil nek false, kaj alie la esprimon de la dekstra flanko.

Per tio ankaŭ povas esti certigata datumtipoj ĉe mankantaj informo:

saveString = frame.args.optional or ""
saveTable  = getTable() or {}

Se la valoro ĉe tio estas malplena kaj/aŭ de malĝusta datumtipo, tiam ĝi estas pravalorizata kun la ĝusta datumtipo.

Ĉar ofte bibliotekaj funkcioj en certaj situacioj nilfalse redonas, sed ĉi tiuj signoĉenoj ne aperu kiel rezulto de la ŝablona enplektado, oni povas ekzemple vere „malplenan“ valoron certigi per la sekva instrukcio:

return fun(x) or ""

Se fun(x) redonas realan valoron, tiam tiu estas redonataj al la #invoke; se tio estas nenio, tiam efikas la "".

Analoge oni povas certigi la valoron 1 ĉe „nenio“ aŭ „io“:

return fun(x) and "1" or ""

Ĉar ĉi tiu notado ne plu estas tre superrigardebla, oni ne tro ofte uzu ĉi tiun trukon.

Sinsekvo de lokaj funkcioj[redakti | redakti fonton]

La sinsekvo de lokaj funkcioj estas signifa. Loka funkcio devas esti difinita en la fizika ordo de la difinoj, antaŭ ol ĝi povas esti uzata.

"For"-iteracio[redakti | redakti fonton]

Ĉe For-iteracio (de:Zählschleife)

for v = e1, e2 do

la argumentoj estas analizataj nur unufoje ĉe la komenco; poste transigataj en internajn variablojn.

Ne eblas, ene de la iteracio elvoki la finan kondiĉon, ekzemple per e1=e2. Kontraŭe devas esti ekzekutata break-instrukcio.

Tondeti signoĉenajn parametrojn[redakti | redakti fonton]

Nenomitaj signoĉenaj parametroj estu ĉiam tondetaj, se ili devenas el ŝablonoj kaj interspacaj signoj ne estus signifaj. En la ŝablona programado tio estis ebla nur per trukoj:

{{#if:trim|{{{1}}}}}

En Lua la maniero estus biblioteka funkcio, se estas certigite, ke s estas signoĉeno:

s = mw.text.trim( s )

Uzantodifinitaj objektoj[redakti | redakti fonton]

Estus aŭdace, rigardi Lua kiel objektorientitan lingvon. Tamen povas esti aranĝataj per metatable de table kelkaj objektecaj trajtoj.

Per tio povas esti difinataj specifaj metodoj por:

Aliro al elemento, nova elemento, kunigo, longo, komparo, aritmetikaj operacioj.

Ĉar la table sen tio povas enhavi funkciojn kiel elementojn, povas esti kreataj laŭ speco de memdifinebla objekto metodoj kaj ecoj kaj ankaŭ asignataj per genera funkcio al ĉiuj instancoj de „klaso“; tiuj povas esti eĉ konvene heredataj kaj superskribataj. Tio oni ne kredas kapabla al ĉi tiu simpla lingvo je la unua rigardo.