Zdieľať cez


Sekcie

Section-document je program jazyka M, ktorý sa skladá z viacerých pomenovaných výrazov.

section-document:
      Sekcii
Sekcii:
      literal-attributesopt
sectionsection-name;section-members opt
section-name:
      identifikátor
section-members:
      sekcia section-member section-membersopt
section-member:
      literal-attributesoptsharedopt section-member-name expression
=;
section-member-name:
      Identifikátor

V jazyku M je sekcia organizačnou koncepciou, ktorá umožňuje pomenúť a zoskupiť súvisiace výrazy v rámci dokumentu. Každá sekcia obsahuje názov sekcie section-name, ktorý identifikuje sekciu a kvalifikuje názvy členov sekcie section-members deklarovaných v tejto sekcii. Člen section-member sa skladá z názvu člena member-name a výrazu. Výrazy člena sekcie môžu odkazovať na iných členov sekcie v rámci tej istej sekcie priamo podľa názvu člena.

Nasledujúci príklad znázorňuje dokument so sekciami:

section Section1; 

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

Výrazy členy sekcií môžu odkazovať na členov sekcie nachádzajúcich sa v iných sekciách pomocou výrazu section-access-expression, ktorý kvalifikuje názov člena sekcie pomocou názvu obslúženej sekcie.

section-access-expression:
      identifier identifier (identifikátor)
!

Nasledujúci príklad znázorňuje množinu dvoch dokumentov obsahujúcich sekcie, ktoré sú navzájom referenčné:

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

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

Členov sekcie možno voliteľne deklarovať ako shared, čím sa vynechá požiadavka na použitie výrazu section-access-expression pri odkazovaní na zdieľaných členov mimo obsahujúcej sekcie. Na zdieľaných členov v externých sekciách možno odkazovať pomocou nekvalifikovaného názvu člena, pokiaľ v odkazunej sekcii nie je deklarovaný žiadny člen s rovnakým názvom a žiadna iná sekcia nemá podobného zdieľaného člena.

Nasledujúci príklad ilustruje správanie zdieľaných členov pri použití v sekciách v rámci tej istej množiny dokumentov:

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

Definovaním zdieľaného člena s rovnakým názvom v rôznych sekciách sa vytvorí platné globálne prostredie, avšak prístup k zdieľanému členovi vyvolá pri prístupe chybu.

section Section1; 
shared A = 1; 

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

Pri vyhodnocovaní množiny dokumentov sekcií platí toto:

  • Každý názov sekcie section-name musí byť v globálnom prostredí jednoznačný.

  • V rámci sekcie musí mať každý člen sekcie section-name jedinečný názov člena sekcie section-member-name.

  • Zdieľaní členovia sekcií s viac než jednou definíciou vyvolá pri prístupe zdieľaného člena chybu.

  • Súčasť výrazu člena sekcie section-member sa nesmie vyhodnotiť pred prístupom k členovi sekcie.

  • Chyby vzniknuté počas vyhodnocovania súčasti výrazu section-member budú priradené k danmu členovi sekcie pred šírením smerom von, a potom znova vyvolané pri prístupe k členovi sekcie.

Prepájanie na dokumenty

Množinu dokumentov jazyka M so sekciami možno prepojiť na nepriehľadnú hodnotu záznamu, ktorá má v dokumentoch so sekciami jedno pole na zdieľaného člena. Ak majú zdieľaní členovia nejednoznačné názvy, vyskytne sa chyba.

Výsledná hodnota záznamu sa na globálnom prostredí, v ktorom sa vykonal proces prepojenia, úplne uzavrie. Takéto záznamy sú preto vhodnými súčasťami na vytváranie dokumentov jazyka M z iných (prepojených) množín dokumentov jazyka M. Na pomenúvanie konfliktov neexistujú žiadne príležitosti.

Štandardné funkcie Embedded.Value knižnice možno použiť na načítanie týchto "vložených" hodnôt záznamov, ktoré zodpovedajú opätovne použitým komponentom jazyka M.

Preskúmanie dokumentov

Jazyk M poskytuje programový prístup k globálnemu prostrediu #sections pomocou kľúčových slov a #shared .

#sections

Vnútorná premenná #sections vráti všetky sekcie v rámci globálneho prostredia ako záznam. Tento záznam je kódovaný podľa názvu sekcie a každá hodnota je reprezentáciou záznamu zodpovedajúcej sekcie indexovanej podľa názvu člena sekcie.

Nasledujúci príklad znázorňuje dokument skladajúci sa z dvoch sekcií, a záznam vytvorený vyhodnotením #sections vnútornej premennej v kontexte tohto dokumentu:

section Section1; 
A = 1; 
B = 2;  

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

Pri vyhodnocovaní #sectionsplatí toto:

  • Vnútorná premenná #sections zachová stav hodnotenia všetkých výrazov členov sekcie v rámci dokumentu.
  • Vnútorná premenná #sections nevynúti vyhodnotenie žiadnych nevyhodnotených členov sekcie.

#shared

Vnútorná premenná #shared vráti obsah globálneho prostredia ako záznam. (Globálne prostredie sa skladá zo všetkých zdieľaných členov sekcie, ako aj všetkých identifikátorov, ktoré sú priamo zahrnuté v globálnom prostredí hodnotiteľom výrazu.) Tento záznam je kľúčom podľa názvu identifikátora, pričom každá hodnota je hodnotou priradeného identifikátora.

Nasledujúci príklad znázorňuje dokument s dvomi zdieľanými členmi a zodpovedajúci záznam vytvorený vyhodnotením #shared vnútornej premennej v kontexte tohto dokumentu:

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

Pri vyhodnocovaní #sharedplatí toto:

  • Vnútorná premenná #shared zachová stav hodnotenia globálneho prostredia.

  • Vnútorná premenná #shared nevynúti vyhodnotenie žiadnej nevyhodnotenej hodnoty.