章节

section-document 是由多个命名表达式组成的 M 程序。

section-document:
      section
section:
      literal-attributesopt
sectionsection-name;section-members opt
section-name:
      标识符
section-members:
      section-member section-membersopt
section-member:
      literal-attributesoptshared section-member-name 表达式
= ;
section-member-name:
      identifier

在 M 中,节是一个组织概念,可以在文档中进行命名和分组相关表达式。 每个节都有一个 section-name,用于标识该节并限定在该节中声明的 section-members 的名称。 section-member 包括 member-name 和 expression。 节成员表达式可以直接按成员名称引用同一节中的其他节成员。

以下示例演示 section-document:

section Section1; 

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

节成员表达式可以通过 section-access-expression 来引用位于其他节中的节成员,该表达式使用包含节的名称来限定节成员名称。

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

计算一组 section-document 时,以下条件适用:

  • 每个 section-name 在全局环境中必须唯一。

  • 在一个节中,每个 section-member 必须具有唯一的 section-member-name

  • 具有多个定义的共享节成员在访问共享成员时引发错误。

  • 在访问节成员之前,无法计算 section-member 的表达式组件。

  • 在计算 section-member 的表达式组件时引发的错误在向外传播之前与该节成员相关联,然后在每次访问该节成员时再次引发错误。

文档链接

一组 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 内部变量不强制计算任何未计算的值。