Avsnitt
Ett avsnittsdokument är ett M-program som består av flera namngivna uttryck.
section-document:
avsnitt
sektion:
literal-attributesoptsection
section-name;
section-members opt
section-name:
identifierare
section-members:
section-member section-membersopt
section-member:
literal-attributesoptshared
section-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.