Le meilleur moyen d’omettre les bibliothèques standard Lua?

Quel est le meilleur moyen de supprimer ou d’omettre un package de bibliothèque standard Lua? Par exemple, supprimez les fonctions de la bibliothèque os dans un environnement particulier. Le projet en question est la construction de Lua à partir des fichiers sources afin que je puisse modifier le source, bien que je préfère le faire via l’API si possible.

Consultez le fichier luaconf.h dans le kit source pour un access facile à la plupart des configurations au moment de la compilation, telles que le type utilisé pour lua_Number .

Consultez le fichier linit.c dans le kit source pour obtenir la liste des bibliothèques principales chargées en appelant luaL_openlibs() .

La pratique courante consiste à copier ce fichier dans la source de votre application et à le modifier en fonction de vos besoins, en appelant la commande luaL_openlibs() cette copie à la place de la version principale. Si vous comstackz Lua en privé et que vous ne vous connectez pas à l’un des fichiers binarys prédéfinis de la bibliothèque, vous pouvez trouver une méthode pour obtenir l’équivalent qui convient à vos besoins.

Bien entendu, vous n’avez pas non plus besoin de comstackr ou de luaL_openlibs() lien vers les sources de toutes les bibliothèques (telles que os , présentes dans loslib.c ), que vous choisissez de ne pas luaL_openlibs() dans luaL_openlibs() .

La seule bibliothèque que vous ne pouvez probablement pas ipairs() complètement est la bibliothèque de base qui fournit des éléments tels que pairs() , ipairs() , pcall() , tossortingng() et bien d’autres dont il peut être très pratique de se passer. Lorsque vous effectuez un portage dans un environnement où certains sont problématiques, il est généralement judicieux d’examiner de près son implémentation dans lbaselib.c et de lbaselib.c fonctionnalités ou de les réimplémenter à vos besoins.

Modifier:

Une autre approche pour inclure une liste différente de bibliothèques dans l’interpréteur consiste à ne pas appeler du tout luaL_openlibs() . Bien que fourni à titre de commodité, comme toute la bibliothèque auxiliaire, luaL_openlibs() n’est pas obligatoire. Au lieu de cela, ouvrez explicitement uniquement les bibliothèques souhaitées.

Le chapitre 5 du manuel de référence en parle:

Pour avoir access à ces bibliothèques, le programme hôte C doit appeler la fonction luaL_openlibs , qui ouvre toutes les bibliothèques standard. Vous pouvez également les ouvrir individuellement en appelant luaopen_base (pour la bibliothèque de base), luaopen_package (pour la bibliothèque de packages), luaopen_ssortingng (pour la bibliothèque de chaînes), luaopen_table (pour la bibliothèque de tables), luaopen_math (pour la bibliothèque de luaopen_math ), luaopen_math (pour la bibliothèque mathématique), luaopen_io (pour la bibliothèque d’E / S), luaopen_os (pour la bibliothèque du système d’exploitation) et luaopen_debug (pour la bibliothèque de débogage). Ces fonctions sont déclarées dans lualib.h et ne doivent pas être appelées directement: vous devez les appeler comme toute autre fonction Lua C, par exemple, en utilisant lua_call .

Cette dernière phrase est parfois la source de problèmes, car les anciennes versions de Lua ne comportaient pas cette ressortingction. Chacune des fonctions luaopen_xxx() du module individuel suit le même protocole que celui utilisé par la fonction require . Un seul argument doit être passé: une chaîne contenant le nom sous lequel le module est connu. L’exception est le module de base, qui reçoit une chaîne vide car il ne porte aucun nom.

Voici une fonction qui crée un nouvel état Lua et ouvre uniquement les bibliothèques de base et de paquet:

 #include "lua.h" #include "lualib.h" #include "lauxlib.h" lua_State *CreateBasicLua() { lua_State *L; L = luaL_newstate(); if (L) { lua_pushcfunction(L, luaopen_base); lua_pushssortingng(L, ""); lua_call(L, 1, 0); lua_pushcfunction(L, luaopen_package); lua_pushssortingng(L, LUA_LOADLIBNAME); lua_call(L, 1, 0); } return L; } 

Il renvoie le nouveau lua_State en cas de succès, ou NULL en cas d’échec.

Supposons que vous souhaitiez uniquement ouvrir les bibliothèques de base et de package . Dans Lua 5.2, la manière la plus concise est

 luaL_requiref(L, "_G", luaopen_base, 1); luaL_requiref(L, "package", luaopen_package, 1); lua_pop(L, 2); 

C’est comme ça que luaL_openlibs fonctionne dans linit.c , sauf qu’il charge tout.

Je pense que cet article répond à votre question, mais donne un peu plus d’informations sur le sujet. Sachez que vous pouvez également «ne rien faire» de tables entières.

Donc, dans votre exemple, la bibliothèque “os” vous pouvez faire un “os = nil” puis poof !, la bibliothèque “os” est partie. Faire un “os.time ()” après cet exemple renverrait une erreur pour un lib / table maintenant non-existant. De plus, si vous vouliez simplement supprimer la méthode “time” dans “os”, vous pouvez simplement faire “os.time = nil”.