2010-04-28 8 views
3

Je souhaite charger des données écrites dans une variante de lua (eyeonScript). Cependant, les données est truffé de références à l'initialisation des fonctions qui ne sont pas en lua plaine:Comment gérer les fonctions d'initialisation inconnues dans lua?

Redden = BrightnessContrast { 
    Inputs = { 
     Red = Input { 
      Value = 0, 
     }, 
    }, 
} 

lua standard donne des erreurs « tentative d'appeler une valeur nulle » ou « symbole inattendu ». Y at-il un moyen de les attraper et de le passer à une sorte d'initialiseur générique?

Je veux terminer avec une structure de données de table imbriquée.

Merci!

Répondre

4

Définissez une métaméthode __index pour la table des globales. Par exemple, de sorte que les fonctions non définies se comportent comme l'identité:

setmetatable(_G,{__index=function (n) 
          return function (x) return x end 
         end}) 
+0

Merci! C'est à peu près ce dont j'avais besoin. Un petit effet secondaire est que toutes les fautes de frappe se transforment maintenant en fonctions, mais depuis que je cours Lua juste pour l'analyse de cette structure, je ne suis pas trop inquiet à ce sujet. – oofoe

+0

belle astuce lhf. @oofoe: Quoi qu'il en soit, vous pouvez créer un environnement personnalisé pour exécuter le fichier de configuration (avec setfenv), de sorte qu'il ne puisse pas écraser ou polluer votre espace de noms normal. Vous pouvez ensuite définir le métaméthode uniquement sur cet environnement. – u0b34a0f6ae

2

Voici une autre astuce: set __call pour nul, mais vous devez le faire en C ou en utilisant la bibliothèque de débogage. L'avantage de cette astuce est qu'elle ne gère que les appels à des fonctions indéfinies:

debug.setmetatable(nil,{__call=function (x,v) return v end}) 
Questions connexes