Sezioni

Un section-document è un programma M costituito da più espressioni denominate.

section-document:
      section
section:
      literal-attributesopt
section section-name ; section-membersopt
section-name:
      identificatore
section-members:
      section-member section-membersopt
section-member:
      literal-attributesopt
sharedopt section-member-name = expression ;
section-member-name:
      identifier

In M, una sezione è un concetto di carattere organizzativo che consente la denominazione e il raggruppamento di espressioni correlate in un documento. Ogni sezione ha un section-name, che la identifica e qualifica i nomi dei section-member dichiarati all'interno della sezione. Un section-member è costituito da un member-name e da un'expression. Le espressioni membro della sezione possono fare direttamente riferimento ad altri membri all'interno della stessa sezione in base al nome.

Nell'esempio seguente viene illustrato un section-document:

section Section1; 

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

Le espressioni membro della sezione possono fare riferimento a membri che si trovano in altre sezioni tramite una section-access-expression, che qualifica il nome di un membro con il nome della sezione che lo contiene.

section-access-expression:
      identifier
! identifier

Nell'esempio seguente viene illustrato un set di due documenti che contengono sezioni reciprocamente referenziali:

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

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

I membri della sezione possono essere facoltativamente dichiarati come shared. In questo modo si evita di dover usare una section-access-expression quando si fa riferimento a membri condivisi all'esterno della sezione. È possibile fare riferimento ai membri condivisi in sezioni esterne con il nome di membro non qualificato, purché non siano stati dichiarati membri con lo stesso nome nella sezione di riferimento e nessun'altra sezione includa un membro condiviso con lo stesso nome.

Nell'esempio seguente viene illustrato il comportamento dei membri condivisi quando vengono usati tra le sezioni all'interno dello stesso set di documenti:

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

La definizione di un membro condiviso con lo stesso nome in sezioni diverse produce un ambiente globale valido, ma il tentativo di accesso al membro condiviso genera un errore.

section Section1; 
shared A = 1; 

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

Quando si valuta un set di section-document, sono valide le considerazioni seguenti:

  • Ogni section-name deve essere univoco nell'ambiente globale.

  • All'interno di una sezione, ogni section-member deve avere un section-member-name univoco.

  • I membri di sezione condivisi con più di una definizione generano un errore quando si tenta di accedervi.

  • Il componente dell'espressione di un section-member non deve essere valutato prima dell'accesso al membro della sezione.

  • Gli errori generati mentre il componente dell'espressione di un section-member viene valutato sono associati al membro della sezione prima della propagazione verso l'esterno e quindi rigenerati ogni volta che viene eseguito l'accesso al membro della sezione.

Collegamento di documenti

Un set di documenti della sezione M può essere collegato a un valore di record opaco che include un campo per ogni membro condiviso dei documenti di sezione. Se i membri condivisi hanno nomi ambigui, viene restituito un errore.

Il valore del record risultante si chiude completamente sull'ambiente globale in cui è stato eseguito il processo di collegamento. Tali record sono pertanto componenti appropriati per comporre documenti da altri set (collegati) di documenti M. Non sono consentiti conflitti di nomi.

Le funzioni della libreria standard Embedded.Value possono essere usate per recuperare tali valori di record "incorporati" che corrispondono ai componenti M riutilizzati.

Introspezione dei documenti

M consente l'accesso all'ambiente globale a livello di codice mediante le parole chiave #sections e #shared.

#sections

La variabile intrinseca #sections restituisce tutte le sezioni all'interno dell'ambiente globale come record. Questo record è codificato in base al nome della sezione e ogni valore è una rappresentazione di record della sezione corrispondente, indicizzata in base al nome del membro della sezione.

Nell'esempio seguente viene illustrato un documento costituito da due sezioni e dal record generato dalla valutazione della variabile intrinseca #sections all'interno del contesto del documento:

section Section1; 
A = 1; 
B = 2;  

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

Quando si valuta #sections, sono valide le considerazioni seguenti:

  • La variabile intrinseca #sections conserva lo stato di valutazione di tutte le espressioni membro della sezione all'interno del documento.
  • La variabile intrinseca #sections non impone la valutazione dei membri di una sezione non valutati.

#shared

La variabile intrinseca #shared restituisce il contenuto dell'ambiente globale come record. L'ambiente globale è costituito da tutti i membri di sezione condivisi e da tutti gli identificatori inclusi direttamente nell'ambiente globale dall'analizzatore di espressioni. Questo record è codificato in base al nome della sezione e ogni valore è il valore dell'identificatore associato.

Nell'esempio seguente viene illustrato un documento con due membri condivisi e il record corrispondente generato dalla valutazione della variabile intrinseca #shared all'interno del contesto del documento:

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

Quando si valuta #shared, sono valide le considerazioni seguenti:

  • La variabile intrinseca #shared conserva lo stato di valutazione dell'ambiente globale.

  • La variabile intrinseca #shared non impone la valutazione degli eventuali valori non valutati.