Secties
Een sectiedocument is een M-programma dat bestaat uit meerdere benoemde expressies.
section-document:
section
afdeling:
opt-name;
section-membersopt-literal-attributes optsection
sectienaam:
id
sectie-leden:
section-member section-membersopt
sectielid:
literal-attributesoptshared
section-member-name expression=
;
sectie-lidnaam:
Id
In M is een sectie een organisatieconcept waarmee gerelateerde expressies in een document kunnen worden benoemd en gegroepeerd. Elke sectie heeft een sectienaam, waarmee de sectie wordt geïdentificeerd en de namen van de sectieleden worden gekwalificeerd die in de sectie zijn gedeclareerd. Een sectielid bestaat uit een lidnaam en een expressie. Expressies van sectieleden kunnen rechtstreeks op lidnaam verwijzen naar andere sectieleden in dezelfde sectie.
In het volgende voorbeeld ziet u een sectiedocument:
section Section1;
A = 1; //1
B = 2; //2
C = A + B; //3
Expressies van sectieleden kunnen verwijzen naar sectieleden die zich in andere secties bevinden met behulp van een sectietoegangsexpressie, die een sectielidnaam in aanmerking komt met de naam van de betreffende sectie.
section-access-expression:
id-id !
In het volgende voorbeeld ziet u een set van twee documenten met secties die elkaar wederzijds referenteren:
section Section1;
A = "Hello"; //"Hello"
B = 1 + Section2!A; //3
section Section2;
A = 2; //2
B = Section1!A & " world!"; //"Hello, world"
Sectieleden kunnen eventueel worden gedeclareerd als shared
, waardoor de vereiste voor het gebruik van een sectie-toegangsexpressie wordt weggelaten wanneer wordt verwezen naar gedeelde leden buiten de betreffende sectie. Gedeelde leden in externe secties kunnen worden verwezen door hun niet-gekwalificeerde lidnaam zolang geen lid van dezelfde naam wordt gedeclareerd in de verwijzende sectie en geen andere sectie een gedeeld lid met een naam heeft.
In het volgende voorbeeld ziet u het gedrag van gedeelde leden wanneer deze worden gebruikt in verschillende secties binnen dezelfde set documenten:
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
Als u een gedeeld lid met dezelfde naam in verschillende secties definieert, wordt een geldige globale omgeving gegenereerd, maar als u het gedeelde lid opent, treedt er een fout op wanneer deze wordt geopend.
section Section1;
shared A = 1;
section Section2;
shared A = "Hello";
section Section3;
B = A; //Error: shared member A has multiple definitions
Het volgende geldt voor het evalueren van een set sectiedocumenten:
Elke sectienaam moet uniek zijn in de globale omgeving.
Binnen een sectie moet elk sectielid een unieke sectielidnaam hebben.
Gedeelde sectieleden met meer dan één definitie veroorzaken een fout wanneer het gedeelde lid wordt geopend.
Het expressieonderdeel van een sectielid mag niet worden geëvalueerd voordat het sectielid wordt geopend.
Fouten die optreden terwijl het expressieonderdeel van een sectielid wordt geëvalueerd, worden gekoppeld aan dat sectielid voordat ze naar buiten worden doorgegeven en vervolgens telkens opnieuw worden gegenereerd wanneer het sectielid wordt geopend.
Documentkoppeling
Een set M-sectiedocumenten kan worden gekoppeld aan een ondoorzichtige recordwaarde met één veld per gedeeld lid van de sectiedocumenten. Als gedeelde leden dubbelzinnige namen hebben, treedt er een fout op.
De resulterende recordwaarde wordt volledig gesloten over de globale omgeving waarin het koppelingsproces is uitgevoerd. Dergelijke records zijn daarom geschikte onderdelen voor het opstellen van M-documenten uit andere (gekoppelde) sets M-documenten. Er zijn geen mogelijkheden voor naamgevingsconflicten.
De standaardbibliotheekfuncties Embedded.Value
kunnen worden gebruikt om dergelijke 'ingesloten' recordwaarden op te halen die overeenkomen met opnieuw gebruikte M-onderdelen.
Documentintrospectie
M biedt programmatische toegang tot de globale omgeving door middel van de #sections
trefwoorden en #shared
trefwoorden.
#sections
De #sections
intrinsieke variabele retourneert alle secties in de globale omgeving als record. Deze record is gesleuteld op sectienaam en elke waarde is een recordweergave van de bijbehorende sectie geïndexeerd op sectielidnaam.
In het volgende voorbeeld ziet u een document dat bestaat uit twee secties en de record die is geproduceerd door de #sections
intrinsieke variabele te evalueren binnen de context van dat document:
section Section1;
A = 1;
B = 2;
section Section2;
C = "Hello";
D = "world";
#sections
//[
// Section1 = [ A = 1, B = 2],
// Section2 = [ C = "Hello", D = "world" ]
//]
Het volgende geldt voor de evaluatie #sections
:
- De
#sections
intrinsieke variabele behoudt de evaluatiestatus van alle sectielidexpressies in het document. - De
#sections
intrinsieke variabele dwingt de evaluatie van niet-geëvalueerde sectieleden niet af.
#shared
De #shared
intrinsieke variabele retourneert de inhoud van de globale omgeving als record. (De globale omgeving bestaat uit alle gedeelde sectieleden en alle id's die rechtstreeks in de globale omgeving zijn opgenomen door de expressie-evaluator.) Deze record wordt gesleuteld op id-naam, waarbij elke waarde de waarde van de bijbehorende id is.
In het volgende voorbeeld ziet u een document met twee gedeelde leden en de bijbehorende record die is geproduceerd door de #shared
intrinsieke variabele te evalueren binnen de context van dat document:
section Section1;
shared A = 1;
B = 2;
Section Section2;
C = "Hello";
shared D = "world";
//[
// A = 1,
// D = "world"
//]
Het volgende geldt voor de evaluatie #shared
:
De
#shared
intrinsieke variabele behoudt de evaluatiestatus van de globale omgeving.De
#shared
intrinsieke variabele dwingt de evaluatie van een niet-geëvalueerde waarde niet af.