MagPI 11 Page 31
Charm offre deux puissantes opérations de transtypage via les constructions address (variable) pour convertir en entier une variable de tout type et [int] pour convertir un entier vers un autre type. Un grand pouvoir implique de grandes responsabilités cependant, elles sont donc utilisées mais rarement et alors avec précaution. Un exemple se trouve dans le module de bibliothèque Charm debug qui convertit l'adresse du tas en tableau d'octets pour que son contenu puisse être exporté dans un fichier.
Portée
La portée d'une variable se réfère à l'endroit à partir duquel elle est accessible et est liée à sa durée de vie. Une variable peut résider dans l'un des emplacements suivants :
Emplacement | Durée de vie | Consruction |
statique | programme | type v = valeur; |
tas | variable | type v := new V; |
pile | portée | type v := valeur; |
Les variables statiques existent tout au long du programme et sont initialisées lors de la compilation, avec zéro ou nil pour les références. Celles déclarées sur le tas sont créées par l'opérateur new et libérées par l'opérateur delete lorsqu'elles ne sont plus nécessaires. Les variables sur la pile n'existent que dans la portée où elles sont définies, normalement lorsque la procédure est quittée, ou à la fin de l'exécution d'un bloc de code entre les délimiteurs { et }.
Les procédures nommées ~startup et ~shutdown peuvent servir à définir des variables statiques tandis que ~new et ~delete servent à définir des variables stockées dans le tas ou sur la pile quand il faut plus d'une simple compilation ou faire des affectations lors de l'exécution.
Pour limiter la visibilité des informations, les constantes, variables et procédures ne sont par défaut accessibles que dans le module où elles sont déclarées. Cependant, grâce au mot-clé export, il est possible de rendre ces définitions disponibles pour les autres modules. Il faut référencer les modules pour indiquer explicitement leurs dépendances grâce au mot-clé import afin de préciser chaque module dont les définitions publiques doivent être utilisées. Ces références doivent ensuite être qualifiées avec le nom du module importé e.g. Out.vdu.str fait référence à la procédure str de l'instance vdu du module de bibliothèque Out utilisé pour afficher des chaînes à l'écran.
La prochaine fois
La prochaine fois j'envisage d'aborder certains aspects de la programmation Charm avec des exemples de séquences, sélections et itérations pour écrire des expressions, affectations et structures de contrôle.
Exercice
Pour finir, je propose comme exercice ce mois-ci le remplacement du module par défaut !NewProject MyProject par le code suivant pour afficher les racines carrées des douze premiers entiers calculés par la méthode de Newton-Raphson :
import lib.Out; module MyProject { proc sqrt (int n) real { real v := 1; for int i := 0 step inc (i) while i < 5 v := (v + n / v) / 2; return v; } export proc start (ref array ref array char argv) { for int i := 1 step inc (i) while i <= 12 Out.vdu.str ("sqrt ").num_fld (i, 2).str (" = ").float_fld (sqrt (i), 10).nl (); } }