« Initiation au Lua avec Scribunto/Gestion de l'environnement » : différence entre les versions

Contenu supprimé Contenu ajouté
m Robot : Remplacement de texte automatisé (-quelqu'un +quelqu’un)
m Robot : Remplacement de texte automatisé (- l'on + l’on )
Ligne 61 :
==== Gestion programmée de l'erreur ====
 
Comment remédier à ce problème ? Il nous suffit simplement d'éviter que la variable poids soit comparée à un nombre lorsqu'elle contient '''nil''' et que dans ce cas la fonction nous retourne un message d'erreur informant l'utilisatrice de l'erreur qu'elle a commise. Nous devons donc encore perfectionner notre programme en écrivant une nouvelle fonction '''p.alerte5''' qui met en œuvre ce que l'onl’on vient de dire :
 
<syntaxhighlight lang="lua">
Ligne 165 :
Cette façon d'écrire le programme, bien que fonctionnant parfaitement, n'est pas correcte. Pourquoi ?
 
En fait, lorsqu'on écrit '''frame.args[1]''', on fait appel à la valeur de x que nous a fourni l'utilisateur dans la commande #invoke et qui est donc quelque chose d'extérieur au programme. Allez chercher cette valeur met en œuvre des routines qui sont, à elles seules, des programmes qu’il faut appeler et exécuter. tout cela demande du temps. On comprend donc aisément qu'écrire quatre fois '''frame.args[1]''' va demander un temps d'exécution plus long que si l'onl’on ne l'écrivait qu'une seule fois. Il est donc bien préférable d'écrire la fonction en s'arrangeant pour n'avoir qu'une seule exécution de '''frame.args[1]'''. À la première façon d'écrire le programme, nous préférerons donc la deuxième façon suivante :
 
<syntaxhighlight lang="lua">
Ligne 180 :
</syntaxhighlight>
 
On pourrait, à ce niveau, être satisfait, de notre programme et penser que l'onl’on a la meilleure façon possible de l'écrire. En fait, il n'en est rien ! Il est encore possible d'améliorer le temps d'exécution de la fonction '''p.poly'''. Cette façon d'écrire un polynôme, en informatique, n'est pas correcte. Si nous comptons les multiplications et les additions, nous voyons qu’il y a 9 multiplications et 4 additions. Peut-on imaginer une façon d'écrire un polynôme de façon à réduire le nombre d'opérations. Cela est possible en remarquant, tout simplement, que :
 
<math>7x^4+5x^3+3x^2+x+2 = x(7x^3+5x^2+3x+1)+2 = x(x(7x^2+5x+3)+1)+2 = x(x(x(7x+5)+3)+1)+2</math>
Ligne 202 :
 
 
La question qui peut maintenant venir à l'esprit est la suivante : Supposons que l'onl’on ait plusieurs façons d'écrire un programme, comment peut-on savoir laquelle de ces façons est la plus rapide ?
 
Pour cela, nous disposons d'une fonction préprogrammée qui se nomme '''os.clock''' et qui est capable de nous donner une approximation du temps d'exécution du programme que l'onl’on est en train d'écrire. Nous allons donc, dans un [[Module:Polynôme]] essayer de comparer les temps d'exécution des trois façons d'écrire le programme de calcul de la fonction '''p.poly''' vue précédemment. En fait, nous allons écrire trois fonctions : '''p.poly1''', '''p.poly2''' et '''p.poly3''' qui, en plus du résultat nous renvoie le temps d'exécution.
 
<syntaxhighlight lang="lua">
Ligne 263 :
== Comment utiliser des fonctions écrites dans un autre module ==
 
Dans les chapitres précédents, nous avons dit qu'une variable ou une fonction déclarée avec le mot-clé '''local''' n'est utilisable qu'à l'intérieur du module où elles sont déclarées. Cette affirmation sous-entend que si l'onl’on n'emploie pas le mot-clé '''local''', alors la variable ou la fonction déclarées devrait pouvoir être utilisée dans un autre module. Dans ce paragraphe, nous allons donc étudier comment utiliser les variables et les fonctions créées dans un autre module sans le mot-clé '''local'''.
 
Le principal intérêt de cette possibilité va être de pouvoir se confectionner des modules contenant des fonctions qui peuvent être utiles dans plusieurs autres modules en évitant ainsi de devoir les réécrire dans chaque module.
 
La fonction préprogrammée qui va nous permettre d'appeler le contenu d'un autre module est la fonction '''require'''. Il y a deux façons d'utiliser la fonction '''require''' selon que l'onl’on souhaite récupérer des objets, dans un autre module, qui ne se trouve pas dans la table que l'onl’on a pris l'habitude d'appeler '''p''' (mais qui pourrait s'appeler autrement) ou que l'onl’on souhaite récupérer des objets qui sont dans une table '''p'''.
 
 
==== Première façon : On souhaite récupérer des objets indépendants de la table p ====
 
Il est, bien sût, indispensable que les objets que l'onl’on souhaite récupérer ne soient pas déclarés en local.
 
Prenons un exemple : Dans le [[module:Fonction]], nous avions écrit une fonction '''f''' qui élève un nombre au carré. Dans un autre [[module:Aspire]], essayons d'y inclure le module Fonction et de créer une fonction '''carre''' qui appelle la fonction '''f''' pour élever un nombre au carré :
Ligne 290 :
</syntaxhighlight>
 
La fonction '''require''' attend une chaîne de caractères. Nous avons donc dû mettre '''Module:Fonction''' entre guillemet. Ne pas oublier, aussi, le mot '''Module'''. Si l'onl’on avait écrit '''require("Fonction")''', nous aurions eu une erreur de script.
 
 
Ligne 296 :
 
 
Nous avons bien obtenu 7 au carré qui donne 49. On peut aussi vérifier que l'onl’on peut récupérer une variable déclarée dans le module que l'onl’on appelle avec '''require''' a condition que cette variable ne soit pas déclarée avec le mot clé '''local''', sinon on obtient une erreur de script.
 
 
==== Deuxième façon : L'objet que l'onl’on souhaite récupérer est dans une table p ====
 
C'est un peu comme si l'onl’on souhaitait utiliser la commande '''#invoke''' à partir d'un autre module. Mais cette commande ne marche pas si elle est utilisée dans un module. Nous allons donc transférer le contenu de la table '''p''' dans une table locale au module appelant.
 
Prenons un exemple : Dans un [[module:Ingère]] écrivons une fonction '''compo''' qui appelle la fonction '''p.cube''' se trouvant dans le [[module:Réservoir]]
Ligne 319 :
</syntaxhighlight>
 
La grosse différence avec ce que l'onl’on avait l'habitude de voir est que l'onl’on ne trouve pas '''frame''' entre les parenthèses de la fonction '''p.cube''' puisque, cette fois, nous n'avons pas l'intention d'utiliser la commande '''#invoke'''. À part cela, le reste est identique !
 
{{Encart