다음을 통해 공유


섹션

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

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

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

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

section Section1; 

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

섹션 멤버 식은 섹션 멤버 이름을 포함하는 섹션의 이름으로 한정하는 section-access-expression을 통해 다른 섹션에 있는 섹션 멤버를 참조할 수 있습니다.

section-access-expression:
      identifier
!identifier

다음 예제에서는 상호 참조되는 섹션을 포함하는 두 개의 문서 집합을 보여 있습니다.

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은 키워드(keyword) 통해 #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 평가되지 않은 값을 강제로 계산하지 않습니다.