Seções
Um documento-de-seção é um programa do M que consiste em várias expressões nomeadas.
documento-de-seção:
section
seção:
atributos literaisoptsection
nome;
da seção membrosda seção opt
nome-da-seção:
identificador
membros-da-seção:
membro-da-seção membros-da-seçãoopcional
membro-da-seção:
literal-attributesoptshared
opt expressão de nome=
de membro de seção ;
nome-do-membro-da-seção:
identificador
No M, uma seção é um conceito organizacional que permite que expressões relacionadas sejam nomeadas e agrupadas em um documento. Cada seção tem um nome-da-seção, que identifica a seção e qualifica os nomes dos membros-da-seção declarados na seção em questão. Um membro-sessão consiste em um nome-membro e em uma expressão. As expressões de membro da seção podem se referir a outros membros da mesma seção, diretamente pelo nome do membro.
O seguinte exemplo 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 um nome de membro da seção com o nome da seção que o contém.
expressão-de-acesso-à-seção:
!
identificador identificador
O seguinte exemplo mostra um conjunto de dois documentos que contém 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 seção podem ser opcionalmente declarados como shared
, o que omite a necessidade de usar uma expressão-de-acesso-à-seção ao se referir a membros compartilhados que existam fora da seção recipiente. Membros compartilhados em seções externas podem ser referenciados pelos respectivos nomes de membro não qualificados, desde que nenhum membro do mesmo nome seja declarado na seção que os referencia e nenhuma outra seção tenha um membro compartilhado de mesmo nome.
O seguinte exemplo ilustra o comportamento de membros compartilhados quando usados entre 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
A definição de um membro compartilhado com o mesmo nome em seções diferentes produzirá um ambiente global válido, no entanto, o acesso ao membro compartilhado resultará em um erro.
section Section1;
shared A = 1;
section Section2;
shared A = "Hello";
section Section3;
B = A; //Error: shared member A has multiple definitions
Os seguintes preceitos são válidos ao avaliar um conjunto de documentos-de-seção:
Cada nome-de-seção precisa ser exclusivo no ambiente global.
Em uma seção, cada membro-da-seção precisa ter um nome-do-membro-da-sessão exclusivo.
Membros da seção compartilhados 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 pode 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 da propagação para o exterior e, em seguida, gerados novamente cada vez que o membro da seção é acessado.
Um conjunto de documentos de seção do M pode ser vinculado a um valor de registro opaco que tem 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 fecha totalmente o ambiente global no qual o processo de vinculação foi executado. Esses registros são, portanto, componentes adequados para compor documentos do M de outros conjuntos (vinculados) de documentos do M. Não há oportunidades para conflitos de nomenclatura.
As funções Embedded.Value
de biblioteca padrão podem ser usadas para recuperar valores de registro "inseridos" que correspondem a componentes do M reutilizados.
O M fornece acesso programático ao ambiente global por meio das palavras-chave #sections
e #shared
.
A variável intrínseca #sections
retorna todas as seções dentro do ambiente global como um registro. Esse registro é codificado 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 seguinte exemplo mostra um documento que consiste em duas seções e o registro produzido pela avaliação da variável intrínseca #sections
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" ]
//]
Os seguintes preceitos são válidos ao avaliar #sections
:
- A variável intrínseca
#sections
preserva o estado de avaliação de todas as expressões de membro da seção dentro do documento. - A variável intrínseca
#sections
não força a avaliação de nenhum membro não avaliado da seção.
A variável intrínseca #shared
retorna o contéudo do ambiente global como um registro. (O ambiente global consiste em todos os membros da seção compartilhada, bem como todos os identificadores incluídos diretamente no ambiente global pelo avaliador de expressão.) Este registro é chaveado pelo nome do identificador, com cada valor do identificador associado.
O seguinte exemplo mostra um documento com dois membros compartilhados e o registro correspondente produzido pela avaliação da variável intrínseca #shared
dentro do contexto desse documento:
section Section1;
shared A = 1;
B = 2;
Section Section2;
C = "Hello";
shared D = "world";
//[
// A = 1,
// D = "world"
//]
Os seguintes preceitos são válidos ao avaliar #shared
:
A variável intrínseca
#shared
preserva o estado da avaliação do ambiente global.A variável intrínseca
#shared
não força a avaliação de nenhum membro valor não avaliado.