Szakaszok
A szakaszdokumentum egy M program, amely több elnevezett kifejezésből áll.
szakasz-dokumentum:
section
szakasz:
literal-attributesoptsection
section-name;
section-members opt
szakasz neve:
azonosító
szakasztagok:
a szakasztagok szekciótagok választhatnak
szakasztag:
literal-attributesoptshared
section-member-name expression=
;
section-member-name:
azonosító
Az M-ben a szakasz egy szervezeti fogalom, amely lehetővé teszi a kapcsolódó kifejezések elnevezését és csoportosítását egy dokumentumon belül. Minden szakasznak van egy szakaszneve, amely azonosítja a szakaszt, és minősíti a szakaszon belül deklarált szakasztagok nevét. A szakasztagok egy tagnévből és egy kifejezésből állnak. A szakasztagkifejezések közvetlenül tagnév alapján hivatkozhatnak az ugyanabban a szakaszban lévő többi szakasztagra.
Az alábbi példa egy szakaszdokumentumot mutat be:
section Section1;
A = 1; //1
B = 2; //2
C = A + B; //3
A szakasztagkifejezések más szakaszokban található szakasztagokra hivatkozhatnak egy szakaszelérési kifejezéssel, amely minősíti a szakasztag nevét az azt tartalmazó szakasz nevével.
section-access-expression:
azonosító !
azonosítója
Az alábbi példa két olyan dokumentumkészletet mutat be, amelyek kölcsönösen hivatkozó szakaszokat tartalmaznak:
section Section1;
A = "Hello"; //"Hello"
B = 1 + Section2!A; //3
section Section2;
A = 2; //2
B = Section1!A & " world!"; //"Hello, world"
A szakasztagok opcionálisan deklarálhatók olyankéntshared
, amely kihagyja a szakasz-hozzáférés-kifejezés használatának követelményét, amikor a szakaszon kívüli megosztott tagokra hivatkozik. A külső szakaszok megosztott tagjaira a nem minősített tagnév hivatkozhat mindaddig, amíg a hivatkozó szakaszban nem deklarálják ugyanahhoz a névhez tartozó tagot, és egyetlen másik szakasz sem rendelkezik hasonló nevű megosztott taggal.
Az alábbi példa a megosztott tagok viselkedését szemlélteti, amikor ugyanazon dokumentumcsoport egyes szakaszaiban használják:
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
A különböző szakaszokban azonos nevű megosztott tag definiálása érvényes globális környezetet eredményez, de a megosztott tag elérésekor hiba lép fel.
section Section1;
shared A = 1;
section Section2;
shared A = "Hello";
section Section3;
B = A; //Error: shared member A has multiple definitions
A szakaszdokumentumok egy csoportjának kiértékelésekor a következők a következők:
Minden szakasznévnek egyedinek kell lennie a globális környezetben.
Egy szakaszon belül minden szakasztagnak egyedi tagnévvel kell rendelkeznie.
Egynél több definícióval rendelkező megosztott szakasztagok hibát jeleznek a megosztott tag elérésekor.
A szakasztag kifejezésösszetevőjét nem lehet kiértékelni a szakasztag elérése előtt.
A szakasztag kifejezésösszetevőjének kiértékelése során felmerülő hibák a szakasztaghoz vannak társítva a kifelé propagálás előtt, majd a szakasztag minden egyes elérésekor újra felmerülnek.
Az M szakaszdokumentumok halmaza olyan átlátszatlan rekordértékhez csatolható, amely a szakaszdokumentumok megosztott tagonként egy mezőjét tartalmazza. Ha a megosztott tagok neve nem egyértelmű, hibaüzenet jelenik meg.
Az eredményként kapott rekordérték teljes mértékben bezárul azon a globális környezetben, amelyben a csatolási folyamatot végrehajtották. Az ilyen rekordok ezért alkalmasak M-dokumentumok más (csatolt) M-dokumentumokból való írására. Az ütközések elnevezésére nincs lehetőség.
A standard kódtárfüggvények Embedded.Value
olyan "beágyazott" rekordértékek lekérésére használhatók, amelyek megfelelnek az újrafelhasznált M-összetevőknek.
Az M programozott hozzáférést biztosít a globális környezethez a kulcsszavak és #shared
a #sections
kulcsszavak használatával.
A #sections
belső változó rekordként adja vissza a globális környezet összes szakaszát. Ezt a rekordot szakasznév határozza meg, és minden érték a megfelelő szakasznak a szakasztag nevével indexelt rekordképe.
Az alábbi példa egy dokumentumot mutat be, amely két szakaszból és az adott dokumentum kontextusában lévő belső változó kiértékelésével #sections
létrehozott rekordból áll:
section Section1;
A = 1;
B = 2;
section Section2;
C = "Hello";
D = "world";
#sections
//[
// Section1 = [ A = 1, B = 2],
// Section2 = [ C = "Hello", D = "world" ]
//]
A kiértékelés #sections
során a következők a következők:
- A
#sections
belső változó megőrzi a dokumentum összes szakasztagkifejezésének kiértékelési állapotát. - A
#sections
belső változó nem kényszeríti a nem értékelt szakasztagok kiértékelését.
A #shared
belső változó rekordként adja vissza a globális környezet tartalmát. (A globális környezet az összes megosztott szakasztagból, valamint a kifejezésértékelő által a globális környezetbe közvetlenül belefoglalt azonosítókból áll.) Ezt a rekordot azonosítónév határozza meg, és mindegyik érték a társított azonosító értéke.
Az alábbi példa egy két megosztott taggal rendelkező dokumentumot és a megfelelő rekordot mutatja be a belső változónak a #shared
dokumentum kontextusában történő kiértékelésével:
section Section1;
shared A = 1;
B = 2;
Section Section2;
C = "Hello";
shared D = "world";
//[
// A = 1,
// D = "world"
//]
A kiértékelés #shared
során a következők a következők:
A
#shared
belső változó megőrzi a globális környezet kiértékelési állapotát.A
#shared
belső változó nem kényszeríti a nem értékelt értékek kiértékelését.