Sections

Un section-document est un programme M qui se compose de plusieurs expressions nommées.

section-document :
      section
section :
      literal-attributesopt
sectionsection-name;section-membersopt
section-name :
      identificateur
section-members :
      section-member section-membersopt
section-member :
      literal-attributesopt
sharedopt 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 :
      identifier
!identifier

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.

Liaison de documents

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.

Introspection de document

M fournit un accès programmatique à l’environnement global au moyen des mots clés #sections et #shared.

#sections

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.

#shared

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.