Secciones

section-document es un programa de M que consta de varias expresiones con nombre.

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

En M, una sección es un concepto de organización que permite asignar un nombre a las expresiones relacionadas y agruparlas dentro de un documento. Cada sección tiene un nombre de sección (section-name), que identifica la sección y califica los nombres de los miembros de sección (section-member) declarados en la sección. Un miembro de sección consta de un nombre de miembro y una expresión. Las expresiones de miembro de sección pueden hacer referencia a otros miembros de sección dentro de la misma sección directamente por nombre de miembro.

En el siguiente ejemplo se muestra un elemento section-document:

section Section1; 

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

Las expresiones de miembro de sección pueden hacer referencia a miembros de sección ubicados en otras secciones por medio de section-access-expression (expresión de acceso a la sección), que califica un nombre de miembro de sección con el nombre de la sección contenedora.

section-access-expression:
      identifier
!identifier

En el ejemplo siguiente se muestra un conjunto de dos documentos que contiene secciones que se hacen referencia mutuamente:

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

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

Los miembros de la sección se pueden declarar opcionalmente como shared, lo que omite el requisito de usar section-access-expression al hacer referencia a miembros compartidos fuera de la sección contenedora. Se puede hacer referencia a los miembros compartidos en secciones externas por su nombre de miembro no calificado siempre que no se declare ningún miembro del mismo nombre en la sección de referencia y que ninguna otra sección tenga un miembro compartido con un nombre similar.

En el ejemplo siguiente se muestra el comportamiento de los miembros compartidos cuando se usan en secciones del mismo conjunto de documentos:

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

Si se define un miembro compartido con el mismo nombre en secciones diferentes, se generará un entorno global válido, pero el acceso al miembro compartido producirá un error.

section Section1; 
shared A = 1; 

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

Cuando se evalúa un conjunto de elementos section-document, sucede lo siguiente:

  • Cada nombre de sección (section-name) debe ser único en el entorno global.

  • Dentro de una sección, cada section-member debe tener un section-member-name (nombre de miembro de sección) único.

  • Los miembros de sección compartidos con más de una definición generan un error cuando se accede al miembro compartido.

  • El componente de expresión de un section-member no se debe evaluar antes de que se acceda al miembro de sección.

  • Los errores que se producen mientras se evalúa el componente de expresión de un section-member se asocian a ese miembro de sección antes de propagarse hacia fuera y, después, se vuelven a generar cada vez que se accede al miembro de sección.

Vinculación de documentos

Se puede vincular un conjunto de documentos de sección de M a un valor de registro opaco que tenga un campo por cada miembro compartido de los documentos de la sección. Si los miembros compartidos tienen nombres ambiguos, se produce un error.

El valor del registro resultante se cierra por completo en el entorno global en el que se ha realizado el proceso de vínculo. Por tanto, estos registros son componentes adecuados para redactar documentos de M desde otros conjuntos (vinculados) de documentos de M. No hay ninguna oportunidad de conflictos de nomenclatura.

Las funciones de la biblioteca estándar Embedded.Value se pueden usar para recuperar esos valores de registro "insertados" que se corresponden a componentes de M reutilizados.

Introspección de documentos

M proporciona acceso mediante programación al entorno global por medio de las palabras clave #sections y #shared.

#sections

La variable intrínseca #sections devuelve todas las secciones del entorno global como un registro. Este registro tiene claves de nombre de sección y cada valor es una representación de registro de la sección correspondiente indexada por el nombre de miembro de la sección.

En el ejemplo siguiente se muestra un documento con dos secciones y el registro que se genera al evaluar la variable intrínseca #sections en el contexto de ese documento:

section Section1; 
A = 1; 
B = 2;  

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

Cuando se evalúa #sections sucede lo siguiente:

  • La variable intrínseca #sections conserva el estado de evaluación de todas las expresiones de miembro de sección dentro del documento.
  • La variable intrínseca #sections no fuerza la evaluación de ningún miembro de sección no evaluado.

#shared

La variable intrínseca #shared devuelve el contenido del entorno global como un registro. (El entorno global consta de todos los miembros de sección compartidos, así como de los identificadores incluidos directamente en el entorno global por parte del evaluador de expresiones). Este registro posee una clave por nombre de identificador, y cada valor es el valor del identificador asociado.

En el ejemplo siguiente se muestra un documento con dos miembros compartidos y el registro correspondiente generado al evaluar la variable intrínseca #shared en el contexto de ese documento:

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

Cuando se evalúa #shared sucede lo siguiente:

  • La variable intrínseca #shared conserva el estado de evaluación del entorno global.

  • La variable intrínseca #shared no fuerza la evaluación de ningún valor no evaluado.