섹션

섹션 문서는 여러 명명된 식으로 구성된 M 프로그램입니다.

section-document:
      section
section:
      literal-attributesopt
sectionsection-name;section-members opt
section-name:
      식별자
section-members:
      section-member section-membersopt
section-member:
      literal-attributesoptsharedopt section-member-name 식
= ;
section-member-name:
      identifier

M에서 섹션은 관련 식의 이름을 지정하고 문서 내에서 그룹화할 수 있는 조직 개념입니다. 각 섹션에는 섹션 이름을 사용하여 섹션을 식별하고 섹션 내에 선언된 섹션 멤버이름을 한정합니다. 섹션 멤버는 멤버 이름과 식으로 구성됩니다. 섹션 멤버 식은 멤버 이름으로 동일한 섹션 내의 다른 섹션 멤버를 직접 참조할 수 있습니다.

다음 예제에서는 섹션 문서를 보여줍니다.

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-member-name이 있어야 합니다.

  • 둘 이상의 정의가 있는 공유 섹션 멤버는 공유 멤버에 액세스할 때 오류가 발생합니다.

  • 섹션 멤버에 액세스하기 전에 섹션 멤버 의 식 구성 요소를 평가해서는 안 됩니다.

  • 섹션 멤버식 구성 요소가 계산되는 동안 발생하는 오류는 외부로 전파되기 전에 해당 섹션 멤버와 연결된 다음 섹션 멤버에 액세스할 때마다 다시 발생합니다.

문서 연결

M 섹션 문서 집합은 섹션 문서의 공유 멤버당 하나의 필드가 있는 불투명 레코드 값에 연결할 수 있습니다. 공유 멤버의 이름이 모호한 경우 오류가 발생합니다.

결과 레코드 값은 링크 프로세스가 수행된 전역 환경에 대해 완전히 닫힙니다. 따라서 이러한 레코드는 M 문서의 다른(연결된) 집합에서 M 문서를 작성하는 데 적합한 구성 요소입니다. 충돌을 명명할 기회가 없습니다.

표준 라이브러리 함수를 Embedded.Value 사용하여 재사용된 M 구성 요소에 해당하는 "포함된" 레코드 값을 검색할 수 있습니다.

문서 내성

M은 및 #shared 키워드를 통해 #sections 전역 환경에 프로그래밍 방식으로 액세스할 수 있도록 합니다.

#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 평가되지 않은 값을 강제로 계산하지 않습니다.