Sekcje
Dokument-sekcja to program języka M, który składa się z wielu nazwanych wyrażeń.
sekcja-dokument:
section
sekcja:
atrybuty-literałuopt-nazwa-sekcji-składowe-zgodysection
;
nazwa-sekcji:
identifier
elementy członkowskie sekcji:
section-member section-membersopt
składowa sekcji:
atrybuty-literałuopt optshared
wyrażenie nazwa-składowej sekcji=
;
nazwa-składowa-sekcji:
identyfikator
W języku M sekcja jest koncepcją organizacyjną, która umożliwia nazwanie i zgrupowanie powiązanych wyrażeń w dokumencie. Każda sekcja ma nazwę sekcji, która identyfikuje sekcję i kwalifikuje nazwy składowych sekcji zadeklarowanych w sekcji. Element członkowski sekcji składa się z nazwy elementu członkowskiego i wyrażenia. Wyrażenia składowych sekcji mogą odwoływać się do innych składowych sekcji w tej samej sekcji bezpośrednio według nazwy elementu członkowskiego.
W poniższym przykładzie przedstawiono dokument sekcji:
section Section1;
A = 1; //1
B = 2; //2
C = A + B; //3
Wyrażenia składowe sekcji mogą odwoływać się do składowych sekcji znajdujących się w innych sekcjach za pomocą wyrażenia-dostępu-sekcji, które kwalifikuje nazwę elementu członkowskiego sekcji o nazwie zawierającej sekcję.
wyrażenie-dostępu do sekcji:
identyfikator identyfikatora !
W poniższym przykładzie przedstawiono zestaw dwóch dokumentów zawierających sekcje, które wzajemnie się odwołują:
section Section1;
A = "Hello"; //"Hello"
B = 1 + Section2!A; //3
section Section2;
A = 2; //2
B = Section1!A & " world!"; //"Hello, world"
Elementy członkowskie sekcji mogą być opcjonalnie deklarowane jako shared
, co pomija wymaganie użycia wyrażenia-dostępu-sekcji podczas odwoływania się do udostępnionych elementów członkowskich poza sekcją zawierającą. Współużytkowane elementy członkowskie w sekcjach zewnętrznych mogą być określane przez ich niekwalifikowaną nazwę członka, tak długo, jak żaden członek o tej samej nazwie nie jest zadeklarowany w sekcji odwołującej się, a żadna inna sekcja nie ma współużytkowanego elementu członkowskiego o nazwie podobnej.
Poniższy przykład ilustruje zachowanie współużytkowanych elementów członkowskich w przypadku użycia w różnych sekcjach w tym samym zestawie dokumentów:
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
Zdefiniowanie udostępnionego elementu członkowskiego o tej samej nazwie w różnych sekcjach spowoduje wygenerowanie prawidłowego środowiska globalnego, jednak uzyskanie dostępu do udostępnionego elementu członkowskiego spowoduje wystąpienie błędu podczas uzyskiwania dostępu.
section Section1;
shared A = 1;
section Section2;
shared A = "Hello";
section Section3;
B = A; //Error: shared member A has multiple definitions
Podczas oceniania zestawu dokumentów sekcji są przechowywane następujące warunki:
Każda nazwa sekcji musi być unikatowa w środowisku globalnym.
W sekcji każdy element członkowski sekcji musi mieć unikatową nazwę-składową sekcji.
Współużytkowane elementy członkowskie sekcji z więcej niż jedną definicją zgłaszają błąd podczas uzyskiwania dostępu do udostępnionego elementu członkowskiego.
Składnik wyrażenia elementu członkowskiego sekcji nie może być oceniany przed uzyskaniem dostępu do składowej sekcji.
Błędy zgłaszane podczas obliczania składnika wyrażenia elementu członkowskiego sekcji są skojarzone z tym elementem członkowskim sekcji przed propagacją na zewnątrz, a następnie ponownie podniesione za każdym razem, gdy uzyskuje się dostęp do elementu członkowskiego sekcji.
Zestaw dokumentów sekcji języka M można połączyć z nieprzezroczystą wartością rekordu, która ma jedno pole na współużytkowanego elementu członkowskiego dokumentów sekcji. Jeśli współużytkowane elementy członkowskie mają niejednoznaczne nazwy, zostanie zgłoszony błąd.
Wynikowa wartość rekordu w pełni zamyka się w środowisku globalnym, w którym wykonano proces łączenia. Takie rekordy są zatem odpowiednimi składnikami do tworzenia dokumentów M z innych (połączonych) zestawów dokumentów M. Brak możliwości nazewnictwa konfliktów.
Standardowe funkcje Embedded.Value
biblioteki mogą służyć do pobierania takich "osadzonych" wartości rekordów, które odpowiadają ponownie użytym składnikom języka M.
Język M zapewnia programowy dostęp do środowiska globalnego #sections
za pomocą słów kluczowych i .#shared
Zmienna wewnętrzna #sections
zwraca wszystkie sekcje w środowisku globalnym jako rekord. Ten rekord jest kluczem według nazwy sekcji, a każda wartość jest reprezentacją rekordu odpowiedniej sekcji indeksowanej według nazwy składowej sekcji.
W poniższym przykładzie przedstawiono dokument składający się z dwóch sekcji i rekord wygenerowany przez ocenę #sections
zmiennej wewnętrznej w kontekście tego dokumentu:
section Section1;
A = 1;
B = 2;
section Section2;
C = "Hello";
D = "world";
#sections
//[
// Section1 = [ A = 1, B = 2],
// Section2 = [ C = "Hello", D = "world" ]
//]
Podczas oceniania #sections
:
- Zmienna wewnętrzna
#sections
zachowuje stan oceny wszystkich wyrażeń składowych sekcji w dokumencie. - Zmienna wewnętrzna
#sections
nie wymusza oceny żadnych niewartych składowych sekcji.
Zmienna wewnętrzna #shared
zwraca zawartość środowiska globalnego jako rekord. (Środowisko globalne składa się ze wszystkich udostępnionych elementów członkowskich sekcji, a także wszystkich identyfikatorów bezpośrednio uwzględnionych w środowisku globalnym przez ewaluatora wyrażeń). Ten rekord jest kluczem według nazwy identyfikatora, a każda wartość jest wartością skojarzonego identyfikatora.
W poniższym przykładzie przedstawiono dokument z dwoma udostępnionymi elementami członkowskimi i odpowiadającym mu rekordem utworzonym przez ocenę #shared
zmiennej wewnętrznej w kontekście tego dokumentu:
section Section1;
shared A = 1;
B = 2;
Section Section2;
C = "Hello";
shared D = "world";
//[
// A = 1,
// D = "world"
//]
Podczas oceniania #shared
:
Zmienna wewnętrzna
#shared
zachowuje stan oceny środowiska globalnego.Zmienna wewnętrzna
#shared
nie wymusza oceny żadnej nieszacowanej wartości.