ส่วน

section-document เป็นโปรแกรม M ที่ประกอบด้วยนิพจน์ที่มีชื่อหลายรายการ

section-document:
      ส่วน
ส่วน:
      literal-attributesopt
sectionsection-name;section-members opt
section-name:
      ตัวระบุ
section-members:
      section-member section-membersopt
section-member:
      literal-attributesoptsharedsection-member-name expression
=;
section-member-name:
      รหัส

ใน M ส่วน คือแนวคิดองค์กรที่อนุญาตให้มีการตั้งชื่อและจัดกลุ่มนิพจน์ที่เกี่ยวข้องภายในเอกสาร แต่ละส่วนมี section-name ซึ่งระบุส่วนและสร้างคุณสมบัติชื่อของ section-members ที่ประกาศภายในส่วน section-member ประกอบด้วย member-name และนิพจน์ นิพจน์สมาชิกของส่วนอาจอ้างอิงไปยังสมาชิกส่วนอื่น ๆ ภายในส่วนเดียวกันโดยตรงด้วยชื่อสมาชิก

ตัวอย่างต่อไปนี้แสดง 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-documents:

  • 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 อินทรินซิก ไม่บังคับใช้การประเมินค่าที่ยังไม่ได้ประเมิน