Un des problèmes avec l'environnement global, est que justement, il est global...
Toute modification affectera l'ensemble de votre programme.
Par exemple, lorsque vous installez une métatable pour contrôler l'accès global, votre programme dans son ensemble doit suivre ces directives.
Et si vous souhaitez utiliser une bibliothèque qui utilise des variables globales sans les déclarer, vous êtes dans la "panade"...
La version 5.0 de Lua avait introduit les fonctions setfenv() et getfenv() qui sont maintenant dépréciées.
Pour définir l'environnement d'une fonction Lua, vous devrez utiliser un environnement lexical* ou la nouvelle fonction loadin(env, ...) (ou l'équivalent de setfenv() dans la bibliothèque de débogage. (debug.setfenv (object, table)))
Un petit rappel:
loadin(env, ...) est similaire à load(), sauf que env défini l'environnement de la fonction créée.
Les paramètres après env sont similaires à ceux de load().
env peut être une fonction Lua ou un nombre qui spécifie le niveau de la pile de la fonction: Le niveau 1 étant la fonction d'appel.