Bagian
Dokumen bagian adalah program M yang terdiri dari beberapa ekspresi bernama.
section-document:
bagian
bagian:
atribut literalmemilihsection
bagian-nama;
bagian-anggota memilih
nama bagian:
identifier
bagian-anggota:
bagian anggota bagianmemilih
anggota bagian:
atribut literalmemilihshared
ekspresi nama-anggota=
bagian opt ;
section-member-name:
Pengenal
Di M, bagian adalah konsep organisasi yang memungkinkan ekspresi terkait diberi nama dan dikelompokkan dalam dokumen. Setiap bagian memiliki nama bagian, yang mengidentifikasi bagian dan memenuhi syarat nama anggota bagian yang dideklarasikan dalam bagian . Anggota bagian terdiri dari nama anggota dan ekspresi. Ekspresi anggota bagian dapat merujuk ke anggota bagian lain dalam bagian yang sama secara langsung berdasarkan nama anggota.
Contoh berikut menunjukkan dokumen bagian:
section Section1;
A = 1; //1
B = 2; //2
C = A + B; //3
Ekspresi anggota bagian dapat merujuk ke anggota bagian yang terletak di bagian lain dengan cara ekspresi akses bagian, yang memenuhi syarat nama anggota bagian dengan nama bagian yang berisi.
section-access-expression:
pengidentifikasi pengidentifikasi !
Contoh berikut menunjukkan sekumpulan dua dokumen yang berisi bagian yang saling referensial:
section Section1;
A = "Hello"; //"Hello"
B = 1 + Section2!A; //3
section Section2;
A = 2; //2
B = Section1!A & " world!"; //"Hello, world"
Anggota bagian dapat secara opsional dinyatakan sebagai shared
, yang menghilangkan persyaratan untuk menggunakan ekspresi akses bagian saat merujuk ke anggota bersama di luar bagian yang berisi. Anggota bersama di bagian eksternal dapat dirujuk oleh nama anggota mereka yang tidak memenuhi syarat selama tidak ada anggota dengan nama yang sama yang dinyatakan di bagian yang merujuk dan tidak ada bagian lain yang memiliki anggota bersama bernama seperti itu.
Contoh berikut mengilustrasikan perilaku anggota bersama saat digunakan di seluruh bagian dalam kumpulan dokumen yang sama:
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
Menentukan anggota bersama dengan nama yang sama di bagian yang berbeda akan menghasilkan lingkungan global yang valid, namun mengakses anggota bersama akan menimbulkan kesalahan saat diakses.
section Section1;
shared A = 1;
section Section2;
shared A = "Hello";
section Section3;
B = A; //Error: shared member A has multiple definitions
Berikut ini berlaku saat mengevaluasi sekumpulan dokumen bagian:
Setiap nama bagian harus unik di lingkungan global.
Dalam bagian, setiap anggota bagian harus memiliki nama anggota bagian yang unik.
Anggota bagian bersama dengan lebih dari satu definisi menimbulkan kesalahan saat anggota bersama diakses.
Komponen ekspresi anggota bagian tidak boleh dievaluasi sebelum anggota bagian diakses.
Kesalahan yang dimunculkan saat komponen ekspresi anggota bagian dievaluasi dikaitkan dengan anggota bagian tersebut sebelum menyebarluaskan ke luar lalu dinaikkan kembali setiap kali anggota bagian diakses.
Penautan Dokumen
Sekumpulan dokumen bagian M dapat ditautkan ke dalam nilai catatan buram yang memiliki satu bidang per anggota bersama dari dokumen bagian. Jika anggota bersama memiliki nama yang ambigu, kesalahan akan muncul.
Nilai rekaman yang dihasilkan sepenuhnya menutup lingkungan global tempat proses tautan dilakukan. Oleh karena itu, rekaman tersebut adalah komponen yang cocok untuk menyusun dokumen M dari kumpulan dokumen M lainnya (tertaut). Tidak ada peluang untuk penamaan konflik.
Fungsi Embedded.Value
pustaka standar dapat digunakan untuk mengambil nilai rekaman "disematkan" yang sesuai dengan komponen M yang digunakan kembali.
Introspeksi Dokumen
M menyediakan akses terprogram ke lingkungan global melalui #sections
kata kunci dan #shared
.
#sections
Variabel #sections
intrinsik mengembalikan semua bagian dalam lingkungan global sebagai rekaman. Rekaman ini di-key menurut nama bagian dan setiap nilai adalah representasi rekaman dari bagian terkait yang diindeks berdasarkan nama anggota bagian.
Contoh berikut menunjukkan dokumen yang terdiri dari dua bagian dan rekaman yang dihasilkan dengan mengevaluasi #sections
variabel intrinsik dalam konteks dokumen tersebut:
section Section1;
A = 1;
B = 2;
section Section2;
C = "Hello";
D = "world";
#sections
//[
// Section1 = [ A = 1, B = 2],
// Section2 = [ C = "Hello", D = "world" ]
//]
Berikut ini berlaku saat mengevaluasi #sections
:
- Variabel
#sections
intrinsik mempertahankan status evaluasi dari semua ekspresi anggota bagian dalam dokumen. - Variabel
#sections
intrinsik tidak memaksa evaluasi anggota bagian yang tidak dievaluasi.
#shared
Variabel #shared
intrinsik mengembalikan konten lingkungan global sebagai rekaman. (Lingkungan global terdiri dari semua anggota bagian bersama serta pengidentifikasi apa pun yang secara langsung disertakan dalam lingkungan global oleh evaluator ekspresi.) Rekaman ini dikunci oleh nama pengidentifikasi, dengan setiap nilai menjadi nilai pengidentifikasi terkait.
Contoh berikut menunjukkan dokumen dengan dua anggota bersama dan rekaman terkait yang dihasilkan dengan mengevaluasi #shared
variabel intrinsik dalam konteks dokumen tersebut:
section Section1;
shared A = 1;
B = 2;
Section Section2;
C = "Hello";
shared D = "world";
//[
// A = 1,
// D = "world"
//]
Berikut ini berlaku saat mengevaluasi #shared
:
Variabel
#shared
intrinsik mempertahankan status evaluasi lingkungan global.Variabel
#shared
intrinsik tidak memaksa evaluasi nilai apa pun yang tidak dievaluasi.