Разделы
Документ раздела — это программа 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
переменная не принудительно проверяет неоценимое значение.