Dela via


Avsnitt

Ett avsnittsdokument är ett M-program som består av flera namngivna uttryck.

section-document:
      avsnitt
sektion:
      literal-attributesopt
sectionsection-name;section-members opt
section-name:
      identifierare
section-members:
      section-member section-membersopt
section-member:
      literal-attributesoptsharedsection-member-name expression
= ;
section-member-name:
      identifierare

I M är ett avsnitt ett organisationskoncept som gör att relaterade uttryck kan namnges och grupperas i ett dokument. Varje avsnitt har ett avsnittsnamn som identifierar avsnittet och kvalificerar namnen på de avsnittsmedlemmar som deklareras i avsnittet. En avsnittsmedlem består av ett medlemsnamn och ett uttryck. Avsnittsmedlemsuttryck kan referera till andra avsnittsmedlemmar i samma avsnitt direkt efter medlemsnamn.

I följande exempel visas ett avsnittsdokument:

section Section1; 

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

Avsnittsmedlemsuttryck kan referera till avsnittsmedlemmar som finns i andra avsnitt med hjälp av ett section-access-expression, som kvalificerar ett avsnittsmedlemsnamn med namnet på det innehållande avsnittet.

section-access-expression:
      
! identifierare

I följande exempel visas en uppsättning med två dokument som innehåller avsnitt som är ömsesidigt refererande:

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

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

Avsnittsmedlemmar kan eventuellt deklareras som shared, vilket utelämnar kravet på att använda ett section-access-expression när de refererar till delade medlemmar utanför det innehållande avsnittet. Delade medlemmar i externa avsnitt kan hänvisas till med sitt okvalificerade medlemsnamn så länge ingen medlem med samma namn deklareras i det refererande avsnittet och inget annat avsnitt har en delad medlem som liknar namnet.

I följande exempel visas hur delade medlemmar fungerar när de används i olika avsnitt i samma uppsättning dokument:

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

Om du definierar en delad medlem med samma namn i olika avsnitt skapas en giltig global miljö, men åtkomst till den delade medlemmen ger upphov till ett fel vid åtkomst.

section Section1; 
shared A = 1; 

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

Följande gäller när du utvärderar en uppsättning avsnittsdokument:

  • Varje avsnittsnamn måste vara unikt i den globala miljön.

  • I ett avsnitt måste varje avsnittsmedlem ha ett unikt section-member-name.

  • Delade avsnittsmedlemmar med mer än en definition skapar ett fel när den delade medlemmen används.

  • Uttryckskomponenten för en avsnittsmedlem får inte utvärderas innan avsnittsmedlemmen nås.

  • Fel som uppstår när uttryckskomponenten för en avsnittsmedlem utvärderas associeras med den avsnittsmedlemmen innan den sprids utåt och sedan höjs varje gång avsnittsmedlemmen används.

Dokumentlänkning

En uppsättning M-avsnittsdokument kan länkas till ett täckande postvärde som har ett fält per delad medlem i avsnittsdokumenten. Om delade medlemmar har tvetydiga namn utlöses ett fel.

Det resulterande postvärdet stängs helt över den globala miljö där länkprocessen utfördes. Sådana poster är därför lämpliga komponenter för att skapa M-dokument från andra (länkade) uppsättningar med M-dokument. Det finns inga möjligheter att namnge konflikter.

Standardbiblioteksfunktionerna Embedded.Value kan användas för att hämta sådana "inbäddade" postvärden som motsvarar återanvända M-komponenter.

Dokument-introspektion

M ger programmatisk åtkomst till den globala miljön med hjälp av nyckelorden #sections och #shared .

#sections

Den #sections inbyggda variabeln returnerar alla avsnitt i den globala miljön som en post. Den här posten nyckelas efter avsnittsnamn och varje värde är en postrepresentation av motsvarande avsnitt som indexeras efter avsnittsmedlemsnamn.

I följande exempel visas ett dokument som består av två avsnitt och posten som skapas genom att utvärdera den #sections inbyggda variabeln i dokumentets kontext:

section Section1; 
A = 1; 
B = 2;  

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

Följande gäller vid utvärdering #sections:

  • Den #sections inbyggda variabeln bevarar utvärderingstillståndet för alla avsnittsmedlemsuttryck i dokumentet.
  • Den #sections inbyggda variabeln tvingar inte utvärderingen av några ovärdeerade avsnittsmedlemmar.

#shared

Den #shared inbyggda variabeln returnerar innehållet i den globala miljön som en post. (Den globala miljön består av alla delade avsnittsmedlemmar samt eventuella identifierare som ingår direkt i den globala miljön av uttrycksutvärderaren.) Den här posten nyckelas efter identifierarnamn, där varje värde är värdet för den associerade identifieraren.

I följande exempel visas ett dokument med två delade medlemmar och motsvarande post som skapas genom utvärdering av den #shared inbyggda variabeln i dokumentets kontext:

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

Följande gäller vid utvärdering #shared:

  • Den #shared inbyggda variabeln bevarar utvärderingstillståndet för den globala miljön.

  • Den #shared inbyggda variabeln tvingar inte utvärderingen av något ovärderat värde.