Sections
Un section-document est un programme M qui se compose de plusieurs expressions nommées.
section-document :
section
section :
littéral-attributesoptsection
section-name;
section-members opt
section-name :
identificateur
section-members :
section-member section-membersopt
section-member :
littéral-attributesoptshared
section-member-name expression=
;
section-member-name :
identifier
Dans M, une section est un concept organisationnel qui permet de nommer des expressions connexes et de les regrouper dans un document. Chaque section a un section-name, qui identifie la section et qualifie les noms des section-members déclarés dans la section. Un section-member se compose d’un member-name et d’une expression. Les expressions de membre de section peuvent faire référence à d’autres membres de section dans la même section directement par nom de membre.
L'exemple suivant illustre un section-document :
section Section1;
A = 1; //1
B = 2; //2
C = A + B; //3
Les expressions de membre de section peuvent faire référence à des membres de section situés dans d’autres sections au moyen d’une section-access-expression, qui qualifie un nom de membre de section avec le nom de la section contenante.
section-access-expression :
identificateur d’identificateur !
L’exemple suivant illustre un ensemble de deux documents contenant des sections qui sont mutuellement référentielles :
section Section1;
A = "Hello"; //"Hello"
B = 1 + Section2!A; //3
section Section2;
A = 2; //2
B = Section1!A & " world!"; //"Hello, world"
Les membres de section peuvent éventuellement être déclarés comme étant partagés (shared
) ; dans ce cas, il n’est pas nécessaire d’utiliser section-access-expression pour faire référence à des membres partagés en dehors de la section contenante. Les membres partagés dans les sections externes peuvent être référencés par leur nom de membre non qualifié, à condition qu’aucun membre du même nom ne soit déclaré dans la section de référence et qu’aucune autre section n’ait un membre partagé de même nom.
L’exemple suivant illustre le comportement des membres partagés quand ils sont utilisés dans des sections dans le même ensemble de documents :
section Section1;
shared A = 1; // 1
section Section2;
B = A + 2; // 3 (refers to shared A from Section1)
section Section3;
A = "Hello"; // "Hello"
B = A + " world"; // "Hello world" (refers to local A)
C = Section1!A + 2; // 3
La définition d’un membre partagé portant le même nom dans des sections différentes produit un environnement global valide, mais l’accès au membre partagé génère une erreur.
section Section1;
shared A = 1;
section Section2;
shared A = "Hello";
section Section3;
B = A; //Error: shared member A has multiple definitions
Les points suivants s’appliquent lors de l’évaluation d’un ensemble de section-documents :
Chaque section-name doit être unique dans l’environnement global.
Dans une section, chaque section-member doit avoir un section-member-name unique.
Une erreur est générée lors de l’accès à un membre de section partagé qui a plusieurs définitions.
Le composant expression d’un section-member ne doit pas être évalué avant l’accès à ce dernier.
Les erreurs générées lors de l’évaluation du composant expression d’un section-member sont associées à ce membre de section avant d’être propagées vers l’extérieur, puis regénérées à chaque accès au membre de la section.
Un ensemble de documents de sections M peut être lié à une valeur d’enregistrement opaque qui contient un champ par membre partagé des documents de sections. Si les membres partagés ont des noms ambigus, une erreur est générée.
La valeur d’enregistrement résultante ferme complètement l’environnement global dans lequel le processus de liaison a été effectué. Ainsi, ces enregistrements sont des composants appropriés pour composer des documents M à partir d’autres ensembles (liés) de documents M. Il n’existe aucune possibilité de conflits de noms.
Les fonctions de bibliothèque standard Embedded.Value
peuvent être utilisées pour récupérer des valeurs d’enregistrement « incorporées » qui correspondent à des composants M réutilisés.
M fournit un accès programmatique à l’environnement global au moyen des mots clés #sections
et #shared
.
La variable intrinsèque #sections
retourne toutes les sections de l’environnement global sous la forme d’un enregistrement. Cet enregistrement est indexé par nom de section et chaque valeur est une représentation d’enregistrement de la section correspondante indexée par nom de membre de section.
L’exemple suivant montre un document constitué de deux sections et l’enregistrement produit par l’évaluation de la variable intrinsèque #sections
dans le contexte de ce document :
section Section1;
A = 1;
B = 2;
section Section2;
C = "Hello";
D = "world";
#sections
//[
// Section1 = [ A = 1, B = 2],
// Section2 = [ C = "Hello", D = "world" ]
//]
Les points suivants s’appliquent lors de l’évaluation de #sections
:
- La variable intrinsèque
#sections
conserve l’état d’évaluation de toutes les expressions de membre de section dans le document. - La variable intrinsèque
#sections
ne force pas l’évaluation des membres de section non évalués.
La variable intrinsèque #shared
retourne le contenu de l’environnement global sous la forme d’un enregistrement (l’environnement global se compose de tous les membres de section partagés ainsi que de tous les identificateurs directement inclus dans l’environnement global par l’évaluateur d’expression). Cet enregistrement comprend une clé pour le nom de l’identificateur, chaque valeur étant celle de l’identificateur associé.
L’exemple suivant montre un document constitué de deux membres partagés ainsi que l’enregistrement correspondant produit par l’évaluation de la variable intrinsèque #shared
dans le contexte de ce document :
section Section1;
shared A = 1;
B = 2;
Section Section2;
C = "Hello";
shared D = "world";
//[
// A = 1,
// D = "world"
//]
Les points suivants s’appliquent lors de l’évaluation de #shared
:
La variable intrinsèque
#shared
préserve l’état d’évaluation de l’environnement global.La variable intrinsèque
#shared
ne force pas l’évaluation des valeurs non évaluées.