|
Évaluation |
||||||||||
SyntaxeTypes numériquesTypes structurésExpressionsÉvaluationAffectationÉvaluationSubstitutionProcédures |
Le mécanisme de l'évaluation est au coeur du fonctionnement de tout système de calcul formel.AffectationRappelons la syntaxe générale :
Dans cette situation :
On dispose des fonctions suivantes pour savoir si une variable est affectée ou non :
Comme on le voit, unames() retourne un grand nombre de constantes et variables systèmes, en plus de celles (non affectées) de l'utilisateur. ÉvaluationL'évaluation, c'est le "calcul" d'une quantité algébrique. Essentiellement, il s'agit de remplacer par leur contenu les variables qui en ont un.L'évaluation peut être
Cas généralVoici ce qu'il advient d'une expression dans l'évaluation complète et immédiate :Tant qu'il subsiste des noms de variables ayant un contenu ("complète"), le remplacement de ces variables par leurs contenus est effectué dans délai ("immédiate"). On comprend alors que la commande x := x+1 avec x non affecté pose problème. On entrerait dans une succession infinie de remplacements (x+1, x+2, x+3...) si Maple n'était pas pourvu d'un mécanisme de protection. Examinons l'exemple suivant : À l'issue des trois affectations, les variables ont les contenus suivants :
L'évaluation de x déclenche donc trois tours de la boucle décrite précédemment, où x se verra remplacé par y, puis z, puis finalement 1. L'instruction eval( x ) aurait eu le même effet dans ce cas [2]. L'instruction eval( x , n ) permet de forcer l'évaluation à un niveau n donné [3]. En poursuivant l'exemple précédent, elle nous permet de constater que le contenu de x est bien y (et non 1). Des exemples similaires, mais dans d'autres contextes, vont donner des résultats très différents : Structures "volumineuses"La première exception est constituée par les "grosses" structures de données. Il s'agit des types array, table, matrix, proc.La règle dans ce cas est l'évaluation du dernier nom. Cela signifie que lorsque, dans la boucle d'évaluation, Maple rencontre un nom de variable dont le contenu est d'un des types précédents, ce nom n'est pas remplacé par son contenu. Considérons la situation suivante, qui ne diffère de l'exemple initial que par le type du contenu de z : Un autre exemple, utilisant une procédure : Il faut, dans ces cas, forcer l'évaluation complète avec eval. Toutefois, cela ne nous donne pas encore accès aux fonctions de bibliothèque et autres fonctions de Maple qui sont programmées en Maple même. On peut malgré tout accéder au code de ces fonctions après avoir saisi l'incantation : interface(verboseproc = 2). Constatons que celle-ci rend Maple beaucoup plus disert : Toutefois, ce réglage n'est d'aucune utilité dans le cas des fonctions incorporées de Maple. Celles-ci ne sont pas programmées en Maple ; elles utilisent l'option builtin et résistent à tout examen : Variable localesUne autre exception survient à l'intérieur des procédures pour les variables locales. Celles-ci sont discutées dans la section "Fonctions et procédures".Disons seulement que de sont des variables qui n'existent que le temps qu'une procédure soit active. Donnons-en un exemple : Notons que Maple se permet de localiser automatiquement certaines variables dans les procédures :
On effectue donc un seul tour de la boucle d'évaluation. Considérons l'exemple suivant, identique à celui du début, hormis qu'il est situé dans une procédure : La variable x, locale à la procédure test, n'a été évaluée qu'au niveau 1. Il faudra donc, dans les procédures, utiliser eval pour forcer l'évaluation complète si nécessaire. Commandes seq et forseq n'évalue pas ses arguments, et ne les affecte pas non plus. for les affecte sans les évaluer.Cela peut produire des résultats inattendus : Par comparaison, sum et prod affectent initialement la variable (et l'évaluent). Si celle-ci est déjà affectée, cela produit une erreur. Il est donc parfois utile de différer l'évaluation. Évaluation différéeOn diffère l'évaluation d'une variable à l'aide de guillemets simples (apostrophes).On fera attention à ne pas confondre :
Voici un exemple : L'évaluation complète retire un niveau de guillemets simples ' ' . Ceux-ci ne font que différer l'évaluation de la variable. D'autre part, ils n'empêchent pas les simplifications automatiques. Une application possible est l'effacement d'une seule variable x :
Dans le cas des tableaux p. ex. : ... on peut remarquer que les guillemets simples "passent à travers" les crochets et diffèrent aussi l'évaluation de l'indice. Paramètres (arguments) des procéduresUn simple mot pour mentionner que ce ne sont pas des variables.Ce sont des valeurs qui sont récupérées au moment de l'appel de la procédure. Il n'y a pas de création de variable homonyme [5]. Plus de détails dans la section "Fonctions et procédures", notamment sur les modalités particulières d'évaluation de ces paramètres. SubstitutionsLes remarques sur l'évaluation éclairent le mécanisme des substitutions, quand plusieurs ont lieu dans une même instruction subs :
Dans ce second cas, on voit qu'il n'y a pas d'évaluation intermédiaire (entre les { }), et que les substitutions sont réellement simultanées. Notes[1] L'évaluation de cette variable ne produit rien d'autre que l'affichage de son nom. [2] Cette instruction existe pour forcer l'évaluation complète dans les cas exceptionnels. [3] Elle limite à n le nombre de tours de la boucle d'évaluation. [4] Sans eux, x serait remplacé par son contenu. [5] On parle de "transmission par valeur" des arguments. |