Поделиться через


Разделы

Документ раздела — это программа M, состоящая из нескольких именованных выражений.

документ-с-разделами:
      конфигурации
раздел:
      Литерал-атрибутыopt section-name;section-members optsection
название-раздела:
      идентификатор
элементы-раздела:
      элемент-раздела элементы-разделанеобязательно
элемент-раздела:
      выражение "литерал-атрибутыoptshared section-member-name
=expression" ;
название-элемента-раздела:
      идентификатор

В M раздел представляет собой организационную концепцию, которая позволяет именовать и группировать связанные выражения в документе. Каждый раздел имеет имя раздела, которое определяет раздел и квалифифициирует имена членов раздела, объявленных в разделе. Элемент раздела состоит из имени элемента и выражения. Выражения элементов раздела могут ссылаться на другие члены раздела в том же разделе непосредственно по имени члена.

В следующем примере показан документ раздела:

section Section1; 

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

Выражения элементов раздела могут ссылаться на элементы раздела, расположенные в других разделах, с помощью выражения section-access-expression, который квалифифициирует имя члена раздела с именем содержащего раздела.

выражение-доступа-к-разделу:
      Идентификатор идентификатора
!

В следующем примере показан набор двух документов, содержащих разделы, которые являются взаимонаправленными:

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

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

Члены разделов могут быть объявлены sharedкак необязательные, что исключает необходимость использования выражения section-access-expression при ссылке на общие члены вне содержащего раздела. Общие члены во внешних разделах могут ссылаться на их неквалифицированное имя участника, если ни один член того же имени не объявлен в разделе ссылки, а другой раздел не имеет аналогичного имени общего члена.

В следующем примере показано поведение общих членов при использовании между разделами в одном наборе документов:

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

Определение общего члена с тем же именем в разных разделах приведет к возникновению допустимой глобальной среды, однако при доступе к общему члену возникает ошибка при доступе.

section Section1; 
shared A = 1; 

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

При оценке набора разделов содержится следующее:

  • Каждое имя раздела должно быть уникальным в глобальной среде.

  • В разделе каждый элемент раздела должен иметь уникальное имя элемента раздела.

  • Общие члены раздела с несколькими определениями вызывают ошибку при доступе к общему элементу.

  • Компонент выражения элемента раздела не должен оцениваться перед доступом к элементу раздела.

  • Ошибки, возникающие при оценке компонента выражения элемента раздела , связаны с этим элементом раздела перед распространением внутрь, а затем повторно возникают при каждом обращении к члену раздела.

Связывание документов

Набор документов раздела M можно связать с непрозрачным значением записи с одним полем для каждого общего члена документов раздела. Если общие члены имеют неоднозначные имена, возникает ошибка.

Полученное значение записи полностью закрывается по глобальной среде, в которой был выполнен процесс связывания. Таким образом, такие записи подходят для создания документов M из других (связанных) наборов документов M. Нет возможностей для конфликтов именования.

Стандартные функции Embedded.Value библиотеки можно использовать для получения таких "внедренных" значений записей, соответствующих повторно используемым компонентам M.

Интроспекция документа

M предоставляет программный доступ к глобальной среде с помощью #sections ключевых слов и #shared ключевых слов.

#sections

Встроенная #sections переменная возвращает все разделы в глобальной среде в виде записи. Эта запись определяется именем раздела, а каждое значение — это представление соответствующего раздела, индексированного по имени члена раздела.

В следующем примере показан документ, состоящий из двух разделов и записи, созданной путем оценки #sections встроенной переменной в контексте этого документа:

section Section1; 
A = 1; 
B = 2;  

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

При оценке #sectionsниже приведены следующие элементы:

  • Встроенная #sections переменная сохраняет состояние оценки всех выражений элементов раздела в документе.
  • Встроенная #sections переменная не принудительно выполняет оценку неоцененных элементов раздела.

#shared

Встроенная #shared переменная возвращает содержимое глобальной среды в виде записи. (Глобальная среда состоит из всех элементов общего раздела, а также всех идентификаторов, непосредственно включенных в глобальную среду вычислителем выражений.) Эта запись ключом определяется именем идентификатора, при этом каждое значение является значением связанного идентификатора.

В следующем примере показан документ с двумя общими элементами и соответствующей записью, созданной путем оценки #shared встроенной переменной в контексте этого документа:

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

При оценке #sharedниже приведены следующие элементы:

  • Встроенная #shared переменная сохраняет состояние оценки глобальной среды.

  • Встроенная #shared переменная не принудительно проверяет неоценимое значение.