區段
section-document 是包含多個命名運算式的 M 程式。
section-document:
section
section:
literal-attributesopt section
section-name ;
section-membersopt
section-name:
identifier
section-members:
section-member section-membersopt
section-member:
literal-attributesopt shared
opt section-member-name =
expression ;
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
內建變數不會強制評估任何未評估的值。