![]() |
Programmation en language LUA |
Les fonctions du noyau LUA |
Ces fonctions permettent d'accéder aux fonctionnalités principales (noyau) du langage Lua. Nous n'entrerons pas dans le détail de toutes les fonctions abordées ici.
Semblable
à la fonction en C assert()
. Si
la condition "test" est false ou nil une erreur est retourné sinon le traitement est effectué. Un message facultatif
peut être retourné en plus du message système. Consulter la fonction error()
pour plus de détails.
Par exemple:
> assert(1==1) -- no error as test was true > assert(1==0) stdin:1: assertion failed! stack traceback: [C]: in function `assert' stdin:1: in main chunk [C]: ? > assert("green"=="blue", "Colours not equal") stdin:1: Colours not equal stack traceback: [C]: in function `assert' stdin:1: in main chunk [C]: ?
Beaucoup de fonctions de Lua, comme io.open
,
renvoient une valeur sur le succès, ou renvoient nil et un message
d'erreur en cas d'échec. Ceci fonctionne bien avec assert
:
file = assert(io.open(filename))
Ce code ouvre filename
en lecture et
l'assigne à la variable file
, ou elle retourne un message d' erreur (2ème valeur de retour de io.open
.)
Fixe la limite d'attribution de mémoire à laquelle le collecteur de zone mémoire non libéré sera appelé. Si la nouvelle limite est moins que la quantité courante d'attribution de mémoire de Lua, ou aucun argument n'est donné, le collecteur est appellé systématiquement.
Consultez le GarbageCollectionTutorial pour plus d'information.
> = gcinfo() -- trouvez la stat courante de mémoire, c.-à-d. 21kb a employé 21 35
> bigalloc = string.rep('a ', 100000)
-- créez une grande chaîne de caractère
> = le gcinfo() -- 164kb a assigné maintenant 164 327
> collectgarbage() -- collection de force
> = gcinfo() -- nous avons libéré une certaine mémoire sur la collection 139 278
> bigalloc = zéro -- libèrent la chaîne de caractère que nous avons créée
> = gcinfo() -- il n'est pas supprimé jusqu'à ce que ses 140 278 rassemblés
> collectgarbage() -- nous rassemblons
> = gcinfo() -- il est supprimé 29 59
Ouvre un fichier LUA et exécute son contenu comme un sous programme (chunk Lua). Appelé sans argument, dofile exécute le contenu de l'entrée standard (stdin).
Renvoie au programme appelant toutes les valeurs retournée par le programme appelé.
En cas d'erreurs, dofile retourne l'erreur au programme appelant (dofile ne fonctionne pas en mode protégé).
Termine la dernière fonction protégée appelée, et renvoie message comme message d'erreur.
La fonction erreur n'a pas de retour.
L'argument de niveau indique où le message d'erreur dirige l'erreur.
Avec le niveau 1 (le défaut), la position d'erreur est la fonction erreur a été appelée.
Le niveau 2 pointe sur l'erreur où la fonction qui a appelé erreur a été appelée ; et ainsi de suite.
Le niveau 0 évite l'ajout des positions des erreurs dans le message d'information.
_G
est une variable globale qui contient
l'environnement global de LUA.
Par exemple pour montrer toutes les variables globales nous pourrions faire ce qui suit :
> table.foreach(_G,print)
:
fonction de 00357098 xpcall
: fonction 00354E10 tostring
: fonction du gcinfo 00354708
: fonction du loadlib
00354E90
: table d'OS 00358B40
: 00355AE0 déballent la
fonction
: 003547C8 le niveau 2 exigent la fonction
:
fonction du getfenv 00354F90
: 00354548... -- etc...
_G
est également récursif . Voir exemple:
> = _ table de G : 00353710
> = _ table de G._G :
00353710
> = _ table de G._G._G : 00353710
Lua lui-même n'emploie pas cette variable, ainsi changer sa valeur n'affecte pas son environnement.
Vous devriez
employer setfenv()
pour changer des environnements.
getfenv(f)
Renvoie l'environnement courant de la fonction f.
f peut être une fonction de Lua ou un nombre, nombre qui indique la fonction à ce niveau de la pile :
Le niveau 1 est la fonction qui appelle getfenv.
Si la fonction donnée n'est pas une fonction de Lua, ou si f est 0, getfenv renvoie l'environnement global.
Le défaut pour f est 1.
Si l'objet n'a pas un metatable, renvoie zéro.
Si l'objet metatable a un champ "__metatable", la fonction renvoie la valeur associée.
Autrement, retours le metatable de l'objet donné.
Retourne deux résultats : le nombre de K bytes de mémoire dynamique que Lua emploie et le seuil courant de collecteur de mémoire (aussi en K bytes).
Renvoie 3 valeurs : une fonction d'iteration, la table t, et 0, de sorte que la construction:
for i,v in ipairs(t) do ... end
réitère sur les pairs (1, t[1 ]), (2, t[2 ])..., jusqu'à la première clef (nombre entier) avec une valeur de zéro dans la table.
Charge un fichier filename comme chaîne de caractères de code (fontion) .
S'il n'y a aucune erreur, le retour peu être une fonction ;
Sinon retourne nil avec un message d'erreur.
L'environnement de la fonction retournée est l'environnement global.
Cette fonction lie le programme LUA avec la
bibliothèque dynamique C "libname
".
À l'intérieur de
cette bibliothèque, elle recherche une fonction "funcname
" et
renvoie cette fonction comme fonction de C. libname
doit être le
nom de fichier complet de la bibliothèque de C, y compris n'importe
son chemin d'accès.
Cette fonction ne supporte pas la norme ANSI C. En tant que tels, elle est seulement disponible sur quelques plateformes (Windows, Linux, Solaris, plus d'autres systèmes d'Unix qui soutiennent la norme de dlfcn).
loadlib
vous donne la capacité d'augmenter vos fonctions native lua
avec des fonctions de C écrites par encapsulation. L'exemple
suivant devrait vous donner quelques conseils si vous voulez créer vos propre fonctions native LUA. Cet exemple fonctionne sous linux mais devrait aussi fonctionner avec d'autres plateformesi.
Tous les fichiers dans l'exemple devraient être dans le même répertoire.
/ * mylib.c pourrait ressembler à ceci : */
#
include "lua.h"
# include "" de stdio.h /* cette fonction sera
exportée vers le lua */
lua_myfunc(lua_State interne statique * l)
{
printf("blabla") ;
retour 0 ;
} /* cette fonction est
notre initialisation */
init(lua_State interne * l)
{
fonctions
personnelles
printf("Registering") ;
lua_register(l, "myfunc",
lua_myfunc) ;
printf("Done s'enregistrant") ;
retour 0 ;
}
Compilez le maintenant le comme librairie (dll sous windows)
Après que ceci vous devrait avoir un dossier
appelé mylib.a
, c'est notre bibliothèque. Laisse
maintenant écrire un manuscrit simple d'essai dans le lua :
luainit = loadlib("./mylib.a", "init") -- appelez
maintenant la fonction enregistrée par
print("New de luainit() de
routine d'initialisation : ".. myfunc) -- commencez le nouveau
print("well de myfunc() de fonction fait.")
TODO : Charge une corde comme gros morceau de Lua (sans le courir). S'il n'y a aucune erreur, des retours le gros morceau compilé comme fonction ; autrement, zéro de retours plus le message d'erreur. L'environnement de la fonction retournée est l'environnement global. Le chunkname facultatif de paramètre est le nom à employer dans des messages d'erreur et corrige l'information.
Permet à un programme de parcouri tous les champs d'une table.
Le premier argument est une table et le deuxième argument est un index dans cette table, la fonction retourne le prochain index de la table et la valeur liées à cette index.
Si la fonction est appelée avec nil en tant que deuxième argument, la fonction retourne le premier index de la table et sa valeur associée.
Si la fonction est appelée avec le dernier index, ou avec nil dans une table vide, la fonction retourne nil.
Si le deuxième argument est absent, alors il est interprété comme nil.
Lua n'a aucune déclaration de champs ; Il n'y a aucune différence entre un champ non existant dans une table ou un champ avec une valeur nil. Par conséquent, la fonction considère seulement des champs avec des valeurs de non nil.
L'ordre dans lequel les index sont énumérés n'est pas indiqué, même pour des index numériques. (pour parcourir une table dans l'ordre numérique, employez un index numérique pour ou la fonction ipairs fonctionnent.)
pairs(t)
Renvoie la prochaine fonction et la table t (ou nil), exemple :
for k,v in pairs(t) do ... end --Appel de fonction en mode protégé (pcall)
pcall(f, arg1, arg2...)
Appelle la fonction f avec ses arguments en mode protégé. Cela signifie qu'aucune erreur à l'intérieur de f n'est propagée ; au lieu de cela, le pcall décèle l'erreur et renvoie un code de statut.
Son premier résultat est le code de statut (un booléen), qui est vrai si l'appel réussit sans erreur.
Dans un tel cas, le pcall renvoie également tous les résultats de l'appel, après ce premier résultat.
En cas de n'importe quelle erreur, le pcall renvoie faux plus le message d'erreur.
print
imprime les valeurs séparées par des virgule vers la sortie standard stdout.
print
ne nécessite pas l'utilisation de tostring
pour la conversion des chaînes de caractères pour être imprimées. Par exemple:
print(1,2, "bouclent ma chaussure", 22/7)
1 2 bouclent
ma chaussure 3.1428571428571
print
est très simple et ne peut parcourir des
tables en imprimant leur contenu, il imprimera juste le type et une
identification unique.
> table={1,2,3}
>print(table)
002FE9C8
print
ne compose pas le texte. Afin de faire ceci
vous devez employer la fonction string.format() en même temps que print
(voir le StringLibraryTutorial) par exemple:
> print(string.format("Pi est approximativement
%.4f", 22/7))
pi est approximativement 3.1429
Vérifie si v1 est égal à v2, sans appeler de metamethode. Renvoie un booléen.
Test d'égalité (rawget)
Obtient la valeur réelle de table[index ], sans appeler de metamethode.
table doit être une table, l'index est n'importe quelle valeur différente de zéro.
Place la valeur réelle dans table[index ] , sans appeler de metamethod.
table doit être une table, l'index est n'importe quelle valeur différente de zéro, et la valeur est n'importe quelle valeur de Lua.
Charge le paquet donné. La fonction commence par regarder dans la table _LOADED pour déterminer si le packagename est déjà chargé.
Si il l'est, il demande en retour la valeur que le paquet a renvoyée quand il a été chargé la première fois. Autrement, il recherche un chemin pour le charger.
Place l'environnement courant à employer par la fonction donnée.
f peut être une fonction de Lua ou un nombre, nombre qui indique la fonction à ce niveau de pile :
Le niveau 1 est la fonction appelle le setfenv.
Place le metatable pour la table donnée. (vous ne pouvez pas changer le metatable d'un userdata de Lua.)
Si metatable est nil, enlève le metatable de la table indiquée.
Si la metatable originale a un champ "__metatable", cela génère une erreur.
Essaye de convertir l'argument e en nombre. Si l'argument est déjà un nombre ou une chaîne de caractère représentant un nombre, alors la fonction tonumber renvoie ce nombre ; autrement, il renvoie nil.
Un argument facultatif indique la base pour interpréter le numéro. La base peut être n'importe quel nombre entier entre 2 et 36, inclus. Dans les bases au-dessus de 10:
la lettre A (en majuscule ou minuscule) représente 10,
la lettre B représente 11, et ainsi de suite,
ainsi la lettre Z représentant 35.
Dans la base 10 (le défaut), le nombre peut avoir une partie décimale, ainsi qu'un exposant. Dans d'autres bases, seulement des nombres entiers non signés sont acceptés.
exmple:
>tonumber("10",2)
2
>tonumber("F",16)
15
tonumber("01010111",2)
87
Reçoit un argument de n'importe quel type et le convertit en chaîne de caractères dans un format raisonnable.
Pour un contrôle complet de la conversion de nombre en chaîne de caractères se référer à la fonction stringformat.
Si la metatable de e a un champ "__tostring_, tostring appelle la valeur correspondante avec e comme argument, et emploie le résultat de l'appel en tant que son résultat.
tostring
convertit son argument (juste son premier argument s'il y
a en plus d'un) en chaîne de caractères.
print
peut être employé avec tostring
. Des valeurs simples
(nombres, chaînes de caractères , booleans, et zéro) sont converties comme vous
le souhiatez. Des Table, Userdata, et les fils,
sont imprimés comme table de ` : ', userdata de ` : ', ou
fil de ` : ', suivi de l'adresse d'un objet interne
d'interprète (qui devrait dans aucun cas être compté au moment).
Notez que contrairement à print
, tostring
n'imprime rien, il convertit juste son argument
à une chaîne de caractères et retourne la valeur.
tostring
le 'comportement de s est extensible. Si la valeur
à convertir a un metatable avec une entrée __tostring
puis que
l'entrée s'appelle avec la valeur à convertir et le résultat de cet
appel est retourné. Ceci vous permet de changer comment tostring
analyse (certaines) tables, en leur donnant un
metatable avec une fonction __tostring
qui exécute la conversion
que vous voulez.
type
renvoie une chaîne de caractères décrivant le type de l'objet
fourni.
> type(1)
'number'
>type(true)
'boolean'
>type("hello")
'string'
> type({})
'table'
La note, le type de nil
est "nil".
>type(nil)
'nil'
Les types possibles retournés dans Lua 5.0 sont : "number", "string", "boolea," table "," function "," fil ", et "userdata ". Un "fil" est une coroutine, et "userdata" est un type de données de C avec une référence propre dans Lua.
unpack(list)
unpack
prend les éléments d'une liste et les renvoie,
par exemple :
> = unpack({1,2,3})
1
2
3
> = unpack({"one", 2, 6*7})
one
2
42
Le nombre d'éléments affiché est défini par la taille de la table, qui n'est pas nécessairement le nombre d'éléments dans la table !
> t = {"one", 2, 6*7}
> t.n = 2
> = table.getn(t)
2
> =
unpack(t)
one
2
Directement de du manuel, _VERSION
est "une
variable globale (pas une fonction) cette des prises une corde
contenant la version courante d'interprète."
> = _ VERSION
'Lua 5.1'
Cette fonction est semblable au pcall, sauf que vous pouvez définir une nouvelle fonction errent de traitement des erreurs en mode protégé . Aucune erreur à l'intérieur de f n'est propagée ; au lieu de cela, le xpcall décèle l'erreur, appelle la fonction d'exception avec l'erreur d'origine, et renvoie une chaîne de caractères comme code de statut.
Son premier résultat est le code de statut (un booléen), qui est vrai si l'appel de fonction réussit sans erreurs. Dans un tel cas, le xpcall renvoie également tous les résultats de l'appel, après ce premier résultat. Pour toutes les autres erreurs, xpcall renvoie false plus le résultat de errent.
![]() |
|