Sdílet prostřednictvím


Oddíly

Dokument oddílu je program M, který se skládá z více pojmenovaných výrazů.

section-document:
      section
Oddíl:
      opt section-name;section-membersliteral-attributes optsection
section-name:
      identifikátor
section-members:
      section-member section-membersopt
section-member:
      literal-attributesoptshared section-member-name expression
=;
section-member-name:
      Identifikátor

V jazyce M je oddíl organizační koncept, který umožňuje pojmenovat a seskupovat související výrazy v dokumentu. Každý oddíl má název oddílu, který identifikuje oddíl a kvalifikuje názvy členů oddílu deklarovaných v rámci oddílu. Člen oddílu se skládá z názvu člena a výrazu. Výrazy členů oddílu mohou odkazovat na ostatní členy oddílu v rámci stejného oddílu přímo podle názvu člena.

Následující příklad ukazuje dokument oddílu:

section Section1; 

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

Výrazy členů oddílu mohou odkazovat na členy oddílu umístěné v jiných oddílech pomocí výrazu section-access-expression, který kvalifikuje název člena oddílu s názvem obsahujícího oddílu.

section-access-expression:
      Identifikátor identifikátoru
!

Následující příklad ukazuje sadu dvou dokumentů obsahujících oddíly, které se vzájemně odkazují:

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

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

Členové oddílu mohou být volitelně deklarovány jako shared, což vynechá požadavek na použití výrazu section-access-při odkazování na sdílené členy mimo obsahující oddíl. Sdílené členy v externích oddílech mohou být odkazovány jejich nekvalifikovaným názvem člena, pokud není v odkazovaném oddílu deklarován žádný člen stejného názvu a žádný jiný oddíl nemá podobného sdíleného člena.

Následující příklad ukazuje chování sdílených členů při použití napříč oddíly ve stejné sadě 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

Definování sdíleného člena se stejným názvem v různých oddílech vytvoří platné globální prostředí, ale přístup ke sdílenému členu při přístupu vyvolá chybu.

section Section1; 
shared A = 1; 

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

Při vyhodnocování sady dokumentů oddílů platí následující:

  • Každý název oddílu musí být v globálním prostředí jedinečný.

  • V rámci oddílu musí mít každý člen oddílu jedinečný název člena oddílu.

  • Sdílené členy oddílu s více než jednou definicí vyvolá chybu při přístupu sdíleného člena.

  • Součást výrazu člena oddílu nesmí být vyhodnocena před přístupem člena oddílu.

  • Chyby vyvolané, když se vyhodnotí komponenta výrazu člena oddílu, jsou přidruženy k danému členu oddílu před rozšířením směrem ven a potom znovu vyvolány při každém přístupu člena oddílu.

Propojení dokumentů

Sadu dokumentů oddílu M lze propojit s neprůhlásnou hodnotou záznamu, která má jedno pole pro sdíleného člena dokumentů oddílu. Pokud mají sdílené členy nejednoznačné názvy, vyvolá se chyba.

Výsledná hodnota záznamu se plně zavře v globálním prostředí, ve kterém byl proces propojení proveden. Tyto záznamy jsou proto vhodné součásti pro vytváření dokumentů M z jiných (propojených) sad dokumentů M. Nejsou k dispozici žádné příležitosti pro konflikty pojmenování.

Standardní funkce Embedded.Value knihovny lze použít k načtení takových "vložených" hodnot záznamů, které odpovídají opakovaně používaným komponentám M.

Introspekce dokumentu

M poskytuje programový přístup ke globálnímu prostředí prostřednictvím #sections klíčových slov a #shared klíčových slov.

#sections

Vnitřní #sections proměnná vrátí všechny oddíly v globálním prostředí jako záznam. Tento záznam je klíčován podle názvu oddílu a každá hodnota představuje reprezentaci záznamu odpovídajícího oddílu indexovaného podle názvu člena oddílu.

Následující příklad ukazuje dokument skládající se ze dvou částí a záznamu vytvořeného vyhodnocením #sections vnitřní proměnné v kontextu tohoto dokumentu:

section Section1; 
A = 1; 
B = 2;  

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

Při vyhodnocování #sectionsplatí následující:

  • Vnitřní #sections proměnná zachovává stav vyhodnocení všech výrazů členů oddílu v dokumentu.
  • Vnitřní #sections proměnná nevynucuje vyhodnocení žádných nepohodnocených členů oddílu.

#shared

Vnitřní #shared proměnná vrátí obsah globálního prostředí jako záznam. (Globální prostředí se skládá ze všech členů sdíleného oddílu a všech identifikátorů přímo zahrnutých do globálního prostředí vyhodnocovačem výrazů.) Tento záznam je klíčován podle názvu identifikátoru, přičemž každá hodnota je hodnotou přidruženého identifikátoru.

Následující příklad ukazuje dokument se dvěma sdílenými členy a odpovídajícím záznamem vytvořeným vyhodnocením #shared vnitřní proměnné v kontextu tohoto dokumentu:

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

Při vyhodnocování #sharedplatí následující:

  • Vnitřní #shared proměnná zachovává stav vyhodnocení globálního prostředí.

  • Vnitřní #shared proměnná nevynucuje vyhodnocení žádné nehodnocené hodnoty.