Sektioner

Et section-document er et M-program, der består af flere navngivne udtryk.

section-document:
      Afsnit
Afsnit:
      literal-attributesopt
sectionsection-name;section-members opt
section-name:
      Identifikator
section-members:
      section-member section-membersopt
section-member:
      literal-attributesoptshared section-member-name expression
=;
section-member-name:
      Id

I M er et afsnit et organisationskoncept, der gør det muligt at navngive og gruppere relaterede udtryk i et dokument. Hvert afsnit har et section-name, som identificerer sektionen og kvalificerer navnene på de section-members , der er erklæret i sektionen. Et section-member består af et medlemsnavn og et udtryk. Sektionsmedlemsudtryk kan referere til andre sektionsmedlemmer i den samme sektion direkte efter medlemsnavn.

I følgende eksempel vises et sektionsdokument:

section Section1; 

A = 1;                          //1
B = 2;                          //2 
C = A + B;                      //3

Sektionsmedlemsudtryk kan referere til sektionsmedlemmer, der er placeret i andre sektioner, ved hjælp af et section-access-expression, som kvalificerer et sektionsmedlems navn med navnet på den indeholdende sektion.

section-access-expression:
      id-id
!

I følgende eksempel vises et sæt af to dokumenter, der indeholder sektioner, der gensidigt refererer til hinanden:

section Section1; 
A = "Hello";                    //"Hello" 
B = 1 + Section2!A;             //3

section Section2; 
A = 2;                          //2 
B = Section1!A & " world!";     //"Hello, world"

Sektionsmedlemmer kan eventuelt erklæres som shared, hvilket udelader kravet om at bruge et section-access-expression , når der henvises til delte medlemmer uden for den indeholder sektion. Delte medlemmer i eksterne sektioner kan refereres til af deres ikke-kvalificerede medlemsnavn, så længe der ikke er erklæret et medlem af det samme navn i det henvisende afsnit, og ingen anden sektion har et delt medlem med samme navn.

I følgende eksempel illustreres funktionsmåden for delte medlemmer, når de bruges på tværs af sektioner i det samme sæt dokumenter:

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

Hvis du definerer et delt medlem med det samme navn i forskellige afsnit, oprettes der et gyldigt globalt miljø, men adgang til det delte medlem medfører en fejl, når der åbnes.

section Section1; 
shared A = 1; 

section Section2; 
shared A = "Hello"; 
 
section Section3; 
B = A;    //Error: shared member A has multiple definitions

Følgende gælder ved evaluering af et sæt sektionsdokumenter:

  • Hvert sektionsnavn skal være entydigt i det globale miljø.

  • I en sektion skal hvert section-member have et entydigt section-member-name.

  • Medlemmer af delte afsnit med mere end én definition udløser en fejl, når det delte medlem tilgås.

  • Udtrykskomponenten for et section-member må ikke evalueres, før der er adgang til sektionsmedlemmet.

  • Fejl, der opstår, mens udtrykskomponenten for et sektionsmedlem evalueres, knyttes til det pågældende sektionsmedlem, før de overføres udad og derefter opløftes igen, hver gang sektionsmedlemmet tilgås.

Dokumentlinkning

Et sæt M-sektionsdokumenter kan sammenkædes med en uigennemsigtig postværdi, der har ét felt pr. delt medlem af sektionsdokumenterne. Hvis delte medlemmer har tvetydige navne, udløses der en fejl.

Den resulterende postværdi lukkes helt over det globale miljø, hvor linkprocessen blev udført. Disse poster er derfor egnede komponenter til at oprette M-dokumenter fra andre (sammenkædede) sæt M-dokumenter. Der er ingen muligheder for navngivningskonflikter.

Standardbiblioteksfunktionerne Embedded.Value kan bruges til at hente sådanne "integrerede" postværdier, der svarer til genbrugte M-komponenter.

Dokumentintrospektion

M giver programmatisk adgang til det globale miljø ved hjælp af nøgleordene #sections og #shared .

#sections

Den #sections indbyggede variabel returnerer alle sektioner i det globale miljø som en post. Denne post er angivet efter sektionsnavn, og hver værdi er en postrepræsentation af den tilsvarende sektion, der er indekseret efter navnet på sektionsmedlemmet.

I følgende eksempel vises et dokument, der består af to sektioner og den post, der oprettes ved at evaluere den #sections indbyggede variabel i dokumentets kontekst:

section Section1; 
A = 1; 
B = 2;  

section Section2;
C = "Hello"; 
D = "world"; 
 
#sections 
//[ 
//  Section1 = [ A = 1, B = 2], 
//  Section2 = [ C = "Hello", D = "world" ] 
//] 

Følgende gælder ved evaluering af #sections:

  • Den #sections indbyggede variabel bevarer evalueringstilstanden for alle sektionsmedlemsudtryk i dokumentet.
  • Den #sections indbyggede variabel gennemtvinger ikke evalueringen af medlemmer af den ikke-evaluerede sektion.

#shared

Den #shared indbyggede variabel returnerer indholdet af det globale miljø som en post. (Det globale miljø består af alle delte sektionsmedlemmer samt eventuelle identifikatorer, der er direkte inkluderet i det globale miljø af udtryks evaluatoren). Denne post angives efter id-navn, hvor hver værdi er værdien af det tilknyttede id.

I følgende eksempel vises et dokument med to delte medlemmer og den tilsvarende post, der oprettes ved at evaluere den #shared indbyggede variabel i dokumentets kontekst:

section Section1;
shared A = 1; 
B = 2; 
 
Section Section2;
C = "Hello";
shared D = "world"; 
 
//[ 
//  A = 1, 
//  D = "world" 
//] 

Følgende gælder ved evaluering af #shared:

  • Den #shared indbyggede variabel bevarer evalueringstilstanden for det globale miljø.

  • Den #shared indbyggede variabel gennemtvinger ikke evalueringen af en ikke-evalueret værdi.