Secções

Um documento de seção é um programa M que consiste em várias expressões nomeadas.

secção-documento:
      section
secção:
      literal-attributesopt
sectionsection-name section-members opt;
nome da secção:
      identificador
Membros da secção:
      membros da secção-membrosda secção optam
Membro da secção:
      literal-attributesoptsharedopt section-member-name expression
= ;
nome-membro-secção:
      identificador

Em M, uma seção é um conceito organizacional que permite que expressões relacionadas sejam nomeadas e agrupadas dentro de um documento. Cada seção tem um nome de seção, que identifica a seção e qualifica os nomes dos membros da seção declarados dentro da seção. Um membro da seção consiste em um nome de membro e uma expressão. As expressões dos membros da secção podem referir-se a outros membros da secção dentro da mesma secção diretamente pelo nome do membro.

O exemplo a seguir mostra um documento de seção:

section Section1; 

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

As expressões de membro da seção podem se referir a membros da seção localizados em outras seções por meio de uma expressão de acesso à seção, que qualifica o nome de um membro da seção com o nome da seção que a contém.

seção-acesso-expressão:
      
! identificador identificador

O exemplo a seguir mostra um conjunto de dois documentos contendo seções que são mutuamente referenciais:

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

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

Os membros da secção podem, opcionalmente, ser declarados como shared, o que omite o requisito de utilizar uma expressão de acesso à secção quando se refere a membros partilhados fora da secção que a contém. Os membros partilhados em secções externas podem ser referidos pelo seu nome de membro não qualificado, desde que nenhum membro com o mesmo nome seja declarado na secção de referência e nenhuma outra secção tenha um membro partilhado com o mesmo nome.

O exemplo a seguir ilustra o comportamento de membros compartilhados quando usados em seções dentro do mesmo 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

Definir um membro compartilhado com o mesmo nome em diferentes seções produzirá um ambiente global válido, no entanto, acessar o membro compartilhado gerará um erro quando acessado.

section Section1; 
shared A = 1; 

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

Ao avaliar um conjunto de documentos de secção, o seguinte aplica-se:

  • Cada nome de seção deve ser exclusivo no ambiente global.

  • Dentro de uma seção, cada membro da seção deve ter um nome de membro da seção exclusivo.

  • Membros da seção compartilhada com mais de uma definição geram um erro quando o membro compartilhado é acessado.

  • O componente de expressão de um membro da seção não deve ser avaliado antes que o membro da seção seja acessado.

  • Os erros gerados enquanto o componente de expressão de um membro da seção é avaliado são associados a esse membro da seção antes de se propagarem para fora e, em seguida, regerados cada vez que o membro da seção é acessado.

Vinculação de documentos

Um conjunto de documentos da seção M pode ser vinculado a um valor de registro opaco que tenha um campo por membro compartilhado dos documentos da seção. Se os membros compartilhados tiverem nomes ambíguos, um erro será gerado.

O valor de registro resultante é totalmente fechado no ambiente global no qual o processo de link foi executado. Tais registos são, portanto, componentes adequados para compor documentos M a partir de outros conjuntos (ligados) de documentos M. Não há oportunidades para nomear conflitos.

As funções Embedded.Value de biblioteca padrão podem ser usadas para recuperar esses valores de registro "incorporados" que correspondem a componentes M reutilizados.

Introspeção de documentos

M fornece acesso programático ao ambiente global por meio das #sections palavras-chave e #shared .

#sections

A #sections variável intrínseca retorna todas as seções dentro do ambiente global como um registro. Esse registro é digitado pelo nome da seção e cada valor é uma representação de registro da seção correspondente indexada pelo nome do membro da seção.

O exemplo a seguir mostra um documento composto por duas seções e o registro produzido pela avaliação da #sections variável intrínseca dentro do contexto desse documento:

section Section1; 
A = 1; 
B = 2;  

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

Ao avaliar #sections, é válido o seguinte:

  • A #sections variável intrínseca preserva o estado de avaliação de todas as expressões dos membros da secção no documento.
  • A #sections variável intrínseca não obriga à avaliação de nenhum membro da secção não avaliado.

#shared

A #shared variável intrínseca retorna o conteúdo do ambiente global como um registro. (O ambiente global consiste em todos os membros da seção compartilhada, bem como quaisquer identificadores diretamente incluídos no ambiente global pelo avaliador de expressão.) Esse registro é digitado pelo nome do identificador, com cada valor sendo o valor do identificador associado.

O exemplo a seguir mostra um documento com dois membros compartilhados e o registro correspondente produzido pela avaliação da #shared variável intrínseca dentro do contexto desse documento:

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

Ao avaliar #shared, é válido o seguinte:

  • A #shared variável intrínseca preserva o estado de avaliação do ambiente global.

  • A #shared variável intrínseca não força a avaliação de nenhum valor não avaliado.