Sdílet prostřednictvím


Hodnoty

Hodnota je data vytvořená vyhodnocením výrazu. Tato část popisuje druhy hodnot v jazyce M. Každý druh hodnoty je přidružen k literální syntaxi, množinu hodnot tohoto typu, sadu operátorů definovaných nad touto sadou hodnot a vnitřní typ přiřazený nově vytvořeným hodnotám.

Kind Literal
Nula null
Logický true    false
Počet 0    1    -1    1.5    2.3e-5
Time #time(09,15,00)
Date #date(2013,02,26)
DateTime #datetime(2013,02,26, 09,15,00)
DateTimeZone #datetimezone(2013,02,26, 09,15,00, 09,00)
Doba trvání #duration(0,1,30,0)
Text "hello"
Binární #binary("AQID")
Seznam {1, 2, 3}
Záznam [ A = 1, B = 2 ]
Tabulka #table({"X","Y"},{{0,1},{1,0}})
Funkce (x) => x + 1
Typ type { number }    type table [ A = any, B = text ]

Následující části podrobně pokrývají jednotlivé druhy hodnot. Typy a popisy typů jsou formálně definovány v typech. Hodnoty funkcí jsou definovány ve funkcích. Následující části uvádějí operátory definované pro každý druh hodnoty a poskytují příklady. Úplná definice sémantiky operátorů se řídí v operátorech.

Null

Hodnota null se používá k reprezentaci absence hodnoty nebo hodnoty neurčitého nebo neznámého stavu. Hodnota null je zapsána pomocí literálu null. Pro hodnoty null jsou definovány následující operátory:

Operátor Výsledek
x > y Je větší než
x >= y Větší než nebo rovno
x < y Je menší než
x <= y Menší než nebo rovno
x = y Equal
x <> y Not equal
x ?? y Coalesce

Nativní typ null hodnoty je vnitřní typ null.

Logický

Logická hodnota se používá pro logické operace s hodnotou true nebo false. Logická hodnota se zapisuje pomocí literálů true a false. Pro logické hodnoty jsou definovány následující operátory:

Operátor Výsledek
x > y Je větší než
x >= y Větší než nebo rovno
x < y Je menší než
x <= y Menší než nebo rovno
x = y Equal
x <> y Not equal
x or y Podmíněný logický operátor OR
x ?? y Coalesce
x and y Podmíněný logický operátor AND
not x Logická HODNOTA NOT

Nativní typ logických hodnot (true a false) je vnitřní typ logical.

Počet

Číselná hodnota se používá pro číselné a aritmetické operace. Tady jsou příklady číselných literálů:

3.14  // Fractional number 
-1.5  // Fractional number 
1.0e3 // Fractional number with exponent
123   // Whole number 
1e3   // Whole number with exponent 
0xff  // Whole number in hex (255)

Číslo je reprezentováno alespoň přesností dvojité (ale může zachovat větší přesnost). Dvojitá reprezentace je kongruentní se standardem dvojité přesnosti IEEE 64bitové dvojité přesnosti pro binární aritmetický zápis s plovoucí desetinnou čárkou definovaným v [IEEE 754-2008]. (Dvojitá reprezentace má přibližný dynamický rozsah od 5,0 x 10324 do 1,7 x 10308 s přesností 15-16 číslic.)

Za číselné hodnoty se považují také následující speciální hodnoty:

  • Kladná nula a záporná nula. Ve většině situací se kladná nula a záporná nula chovají stejně jako jednoduchá hodnota nula, ale některé operace rozlišují mezi těmito dvěma operacemi.

  • Kladné nekonečno (#infinity) a záporné nekonečno (-#infinity). Infinity se vytvářejí pomocí takových operací, jako je dělení nenulového čísla nulou. Například 1.0 / 0.0 získá kladné nekonečno a -1.0 / 0.0 získá záporné nekonečno.

  • Hodnota Not-a-Number (#nan), často zkrácená NaN. Sítě NAN se vytvářejí neplatnými operacemi s plovoucí desetinnou čárkou, jako je například dělení nuly nulou.

Binární matematické operace se provádějí pomocí přesnosti. Přesnost určuje doménu, na kterou jsou operandy zaokrouhleny, a doménu, ve které se operace provádí. Při absenci explicitně zadané přesnosti se takové operace provádějí pomocí dvojité přesnosti.

  • Pokud je výsledek matematické operace pro cílový formát příliš malý, výsledek operace se změní na kladnou nulu nebo zápornou nulu.

  • Pokud je výsledek matematické operace pro cílový formát příliš velký, výsledek operace se změní na kladné nekonečno nebo záporné nekonečno.

  • Pokud je matematická operace neplatná, výsledek operace se stane naN.

  • Pokud je jeden nebo oba operandy operace s plovoucí desetinnou čárkou naN, stane se výsledkem operace NaN.

Pro číselné hodnoty jsou definovány následující operátory:

Operátor Výsledek
x > y Je větší než
x >= y Větší než nebo rovno
x < y Je menší než
x <= y Menší než nebo rovno
x = y Equal
x <> y Not equal
x + y Sum
x - y Rozdíl
x * y Produkt
x / y Podíl
x ?? y Coalesce
+x Unární plus
-x Negace

Nativní typ číselných hodnot je vnitřní typ number.

Čas

Časová hodnota ukládá neprůžnou reprezentaci času dne. Čas se zakóduje jako počet klíštěk od půlnoci, což spočítá počet 100 nanosekundových klíštěk, které uplynuly na 24hodinovém formátu. Maximální počet od půlnoci odpovídá 23:59:59,9999999 hodin.

I když pro časy neexistuje žádná syntaxe literálů, je k dispozici několik standardních funkcí knihovny, které je vytvoří. Časy mohou být také sestaveny pomocí vnitřní funkce #time:

#time(hour, minute, second)

Následující kód musí obsahovat chybu nebo je vyvolán kód Expression.Error důvodu:

0 ≤ hodin ≤ 24
0 ≤ minut ≤ 59
0 ≤ sekundy ≤ 59

Kromě toho, pokud hodina = 24, pak minuta a sekunda musí být nula.

Pro časové hodnoty jsou definovány následující operátory:

Operátor Výsledek
x = y Equal
x <> y Not equal
x >= y Větší než nebo rovno
x > y Je větší než
x < y Je menší než
x <= y Menší než nebo rovno
x ?? y Coalesce

Následující operátory umožňují, aby jeden nebo oba operandy byly datum:

Operátor Levý operand Pravý operand Význam
x + y time duration Posun data o dobu trvání
x + y duration time Posun data o dobu trvání
x - y time duration Posun data o negovanou dobu trvání
x - y time time Doba trvání mezi daty
x & y date time Sloučené datum a čas

Nativní typ časových hodnot je vnitřní typ time.

Datum

Hodnota data ukládá neprůžnou reprezentaci konkrétního dne. Datum se zakóduje jako počet dní od epochy počínaje 1. lednem 0001 Běžnou éru v gregoriánském kalendáři. Maximální počet dní od epochy je 3652058 odpovídající 31. prosinci 9999.

Ačkoli pro kalendářní data neexistuje žádná literálová syntaxe, k jejich vytvoření se poskytuje několik standardních funkcí knihovny. Kalendářní data lze také vytvořit pomocí vnitřní funkce #date:

#date(year, month, day)

Následující kód musí obsahovat chybu nebo je vyvolán kód Expression.Error důvodu:

1 ≤ rok ≤ 9999
1 ≤ měsíc ≤ 12
1 ≤ den ≤ 31

Kromě toho musí být den platný pro vybraný měsíc a rok.

Pro hodnoty kalendářních dat jsou definovány následující operátory:

Operátor Výsledek
x = y Equal
x <> y Not equal
x >= y Větší než nebo rovno
x > y Je větší než
x < y Je menší než
x <= y Menší než nebo rovno
x ?? y Coalesce

Následující operátory umožňují, aby jeden nebo oba operandy byly datum:

Operátor Levý operand Pravý operand Význam
x + y date duration Posun data o dobu trvání
x + y duration date Posun data o dobu trvání
x - y date duration Posun data o negovanou dobu trvání
x - y date date Doba trvání mezi daty
x & y date time Sloučené datum a čas

Nativní typ hodnot kalendářních dat je vnitřní typ date.

DateTime

Hodnota datetime obsahuje datum i čas.

Ačkoli neexistuje žádná literálová syntaxe pro datetimes, k jejich vytvoření se poskytuje několik standardních funkcí knihovny. Datum a časy mohou být také sestaveny pomocí vnitřní funkce #datetime:

#datetime(year, month, day, hour, minute, second)

Následující výraz musí obsahovat chybu nebo chybu s kódem důvodu.Chyba je vyvolána: 1 ≤ rok ≤ 99999
1 ≤ měsíc ≤ 12
1 ≤ den ≤ 31
0 ≤ hodina ≤ 23
0 ≤ minut ≤ 59
0 ≤ sekundy ≤ 59

Kromě toho musí být den platný pro vybraný měsíc a rok.

Pro hodnoty datetime jsou definovány následující operátory:

Operátor Výsledek
x = y Equal
x <> y Not equal
x >= y Větší než nebo rovno
x > y Je větší než
x < y Je menší než
x <= y Menší než nebo rovno
x ?? y Coalesce

Následující operátory umožňují, aby jeden nebo oba operandy byly datetime:

Operátor Levý operand Pravý operand Význam
x + y datetime duration Posun data a času podle doby trvání
x + y duration datetime Posun data a času podle doby trvání
x - y datetime duration Posun data a času o negovanou dobu trvání
x - y datetime datetime Doba trvání mezi datetimes

Nativní typ hodnot datetime je vnitřní typ datetime.

DateTimeZone

Hodnota datetimezone obsahuje hodnotu datetime a časové pásmo. Časové pásmo se zakóduje jako posun počtu minut od času UTC, což spočítá počet minut, po které by časová část data a času měla být posunutá od standardu UTC (Universal Coordinated Time). Minimální počet minut posunu od UTC je -840, což představuje posun UTC o -14:00 nebo čtrnáct hodin dřívějších než UTC. Maximální počet minut posunu od UTC je 840 odpovídající posunu UTC 14:00.

Přestože pro datetimezones neexistuje žádná literálová syntaxe, pro jejich vytvoření je k dispozici několik standardních funkcí knihovny. Datatimezones lze také vytvořit pomocí vnitřní funkce #datetimezone:

#datetimezone(
       year, month, day,
       hour, minute, second,
       offset-hours, offset-minutes)

Následující kód musí obsahovat chybu nebo je vyvolán kód Expression.Error důvodu:

1 ≤ rok ≤ 9999
1 ≤ měsíc ≤ 12
1 ≤ den ≤ 31
0 ≤ hodina ≤ 23
0 ≤ minut ≤ 59
0 ≤ sekundy ≤ 59
-14 ≤ posun hodin ≤ 14
-59 ≤ posun minut ≤ 59

Kromě toho musí být den platný pro zvolený měsíc a rok, a pokud posun-hodiny = 14, pak posun-minuty <= 0 a pokud posun-hodiny = -14, pak posun-minuty >= 0.

Pro hodnoty datetimezone jsou definovány následující operátory:

Operátor Výsledek
x = y Equal
x <> y Not equal
x >= y Větší než nebo rovno
x > y Je větší než
x < y Je menší než
x <= y Menší než nebo rovno
x ?? y Coalesce

Následující operátory umožňují, aby jeden nebo oba operandy byly datetimezonem:

Operátor Levý operand Pravý operand Význam
x + y datetimezone duration Posun datatimezone o dobu trvání
x + y duration datetimezone Posun datatimezone o dobu trvání
x - y datetimezone duration Posun datetimezone o negated duration
x - y datetimezone datetimezone Doba trvání mezi datetimezones

Nativní typ hodnot datetimezone je vnitřní typ datetimezone.

Doba trvání

Hodnota doby trvání ukládá neprůhlásnou reprezentaci vzdálenosti mezi dvěma body na časové ose měřenou 100 nanosekundovými ticky. Velikost doby trvání může být buď kladná, nebo záporná, přičemž kladné hodnoty označují průběh dopředu v čase a záporné hodnoty označující průběh v čase zpět. Minimální hodnota, kterou lze uložit v době trvání , je -9 223 372 036 854 775 808 ticks nebo 10 675 199 dní 2 hodiny 48 minut 05,4775808 sekund v čase. Maximální hodnota, kterou lze uložit v době trvání , je 9 223 372 036 854 775 807 škrtů nebo 10 675 199 dní 2 hodiny 48 minut 05,4775807 sekund dopředu v čase.

Přestože po dobu trvání neexistuje žádná syntaxe literálů, k jejich vytvoření se poskytuje několik standardních funkcí knihovny. Doby trvání mohou být také sestaveny pomocí vnitřní funkce #duration:

#duration(0, 0, 0, 5.5)          // 5.5 seconds 
#duration(0, 0, 0, -5.5)         // -5.5 seconds 
#duration(0, 0, 5, 30)           // 5.5 minutes 
#duration(0, 0, 5, -30)          // 4.5 minutes 
#duration(0, 24, 0, 0)           // 1 day 
#duration(1, 0, 0, 0)            // 1 day

Pro hodnoty doby trvání jsou definovány následující operátory:

Operátor Výsledek
x = y Equal
x <> y Not equal
x >= y Větší než nebo rovno
x > y Je větší než
x < y Je menší než
x <= y Menší než nebo rovno
x ?? y Coalesce

Následující operátory navíc umožňují, aby jeden nebo oba operandy byly hodnotou doby trvání:

Operátor Levý operand Pravý operand Význam
x + y datetime duration Posun data a času podle doby trvání
x + y duration datetime Posun data a času podle doby trvání
x + y duration duration Součet dob trvání
x - y datetime duration Posun data a času o negovanou dobu trvání
x - y datetime datetime Doba trvání mezi datetimes
x - y duration duration Rozdíl doby trvání
x * y duration number N krát doba trvání
x * y number duration N krát doba trvání
x / y duration number Zlomek doby trvání

Nativní typ hodnot doby trvání je vnitřní typ duration.

Text

Textová hodnota představuje posloupnost znaků Unicode. Textové hodnoty mají odpovídající literálové formě následující gramatiky:

literál _text:
      " opt-text-literal-charactersopt "
text-literal-characters:
      text-literal-character text-literal-charactersopt
text-literal-character:
      jednotextový znak
      character-escape-sequence
      double-quote-escape-sequence
jednotextový znak:

      Libovolný znak kromě " (U+0022) nebo # (U+0023) následovaný ( (U+0028)
double-quote-escape-sequence:
      "" (U+0022, U+0022)

Následuje příklad textové hodnoty:

"ABC" // the text value ABC

U textových hodnot jsou definovány následující operátory:

Operátor Výsledek
x = y Equal
x <> y Not equal
x >= y Větší než nebo rovno
x > y Je větší než
x < y Je menší než
x <= y Menší než nebo rovno
x & y Zřetězení
x ?? y Coalesce

Nativní typ textových hodnot je vnitřní typ text.

Binární

Binární hodnota představuje posloupnost bajtů.

Ačkoli neexistuje žádná literálová syntaxe binárních hodnot, pro jejich vytvoření je k dispozici několik standardních funkcí knihovny. Binární hodnoty lze také vytvořit pomocí vnitřní funkce #binary.

Následující příklad vytvoří binární hodnotu ze seznamu bajtů:

#binary( {0x00, 0x01, 0x02, 0x03} )

Binární hodnoty definují následující operátory:

Operátor Výsledek
x = y Equal
x <> y Not equal
x >= y Větší než nebo rovno
x > y Je větší než
x < y Je menší než
x <= y Menší než nebo rovno
x ?? y Coalesce

Nativní typ binárních hodnot je vnitřní typ binárního typu binární.

List

Hodnota seznamu je hodnota, která při výčtu vytvoří sekvenci hodnot. Hodnota vytvořená seznamem může obsahovat jakýkoli druh hodnoty, včetně seznamu. Seznamy lze vytvořit pomocí syntaxe inicializace následujícím způsobem:

list-expression:
      { item-listopt }
item-list:
      položka
      item
, item-list
položka:
      výraz
      Výraz výrazu
..

Následuje příklad výrazu seznamu, který definuje seznam se třemi textovými hodnotami: "A", "B"a "C".

{"A", "B", "C"}

Hodnota "A" je první položka v seznamu a hodnota "C" je poslední položkou v seznamu.

  • Položky seznamu se nevyhodnocují, dokud se k nim nepřistupuje.
  • Zatímco hodnoty seznamu vytvořené pomocí syntaxe seznamu vytvoří položky v pořadí, v jakém se zobrazují v seznamu položek, obecně mohou seznamy vrácené funkcemi knihovny vytvořit jinou sadu nebo jiný počet hodnot pokaždé, když jsou vypsané.

Chcete-li do seznamu zahrnout posloupnost celého čísla, a..b lze formulář použít:

{ 1, 5..9, 11 }     // { 1, 5, 6, 7, 8, 9, 11 }

Počet položek v seznamu, označovaný jako počet seznamů, lze určit pomocí List.Count funkce.

List.Count({true, false})  // 2 
List.Count({})             // 0

Seznam může mít nekonečně mnoho položek; List.Count pro tyto seznamy není definován a může vyvolat chybu nebo ukončit.

Pokud seznam neobsahuje žádné položky, nazývá se prázdný seznam. Prázdný seznam se zapíše takto:

{}  // empty list

Pro seznamy jsou definovány následující operátory:

Operátor Výsledek
x = y Equal
x <> y Not equal
x & y Concatenate
x ?? y Coalesce

Příklad:

{1, 2} & {3, 4, 5}   // {1, 2, 3, 4, 5} 
{1, 2} = {1, 2}      // true 
{2, 1} <> {1, 2}     // true

Nativní typ hodnot seznamu je vnitřní typ list, který určuje typ anypoložky .

Zaznamenat

Hodnota záznamu je uspořádaná posloupnost polí. Pole se skládá z názvu pole, což je textová hodnota, která jednoznačně identifikuje pole v záznamu a hodnotu pole. Hodnota pole může být libovolný druh hodnoty, včetně záznamu. Záznamy lze vytvořit pomocí syntaxe inicializace, a to následujícím způsobem:

record-expression:
      [ výslovný souhlas se seznamempolí ]
field-list:
      pole
      field-list
,
pole:
      výraz field-name
=
název pole:
      generalizovaný identifikátor
      quoted-identifier

Následující příklad vytvoří záznam s polem s názvem x s hodnotou 1a pole s názvem y s hodnotou 2.

[ x = 1, y = 2 ]

Následující příklad vytvoří záznam s polem s a názvem s vnořenou hodnotou záznamu. Vnořený záznam má pole s názvem b hodnota 2.

[ a = [ b = 2 ] ]

Při vyhodnocování výrazu záznamu platí následující:

  • Výraz přiřazený každému názvu pole slouží k určení hodnoty přidruženého pole.

  • Pokud výraz přiřazený k názvu pole při vyhodnocování vytvoří hodnotu, stane se hodnotou pole výsledného záznamu.

  • Pokud výraz přiřazený k názvu pole při vyhodnocování vyvolá chybu, zaznamená se do pole spolu s chybovou hodnotou, která byla vyvolána. Následný přístup k danému poli způsobí opětovné vyvolání chyby se zaznamenanou chybovou hodnotou.

  • Výraz se vyhodnocuje v prostředí, jako je nadřazené prostředí, pouze s proměnnými sloučenými, které odpovídají hodnotě každého pole záznamu, s výjimkou inicializované hodnoty.

  • Hodnota v záznamu se nevyhodnocuje, dokud se k odpovídajícímu poli nepřistupuje.

  • Hodnota v záznamu se vyhodnocuje maximálně jednou.

  • Výsledkem výrazu je hodnota záznamu s prázdným záznamem metadat.

  • Pořadí polí v záznamu je definováno pořadím, které se zobrazují ve výrazu record-initializer-expression.

  • Každý zadaný název pole musí být jedinečný v rámci záznamu nebo se jedná o chybu. Názvy se porovnávají pomocí řadového porovnání.

    [ x = 1, x = 2 ] // error: field names must be unique 
    [ X = 1, x = 2 ] // OK

Záznam bez polí se nazývá prázdný záznam a je zapsán takto:

[] // empty record

I když pořadí polí záznamu není při přístupu k poli nebo porovnávání dvou záznamů významné, je důležité v jiných kontextech, například při výčtu polí záznamu.

Při získání polí vytvoří stejné dva záznamy různé výsledky:

Record.FieldNames([ x = 1, y = 2 ]) // [ "x", "y" ] 
Record.FieldNames([ y = 1, x = 2 ]) // [ "y", "x" ]

Počet polí v záznamu lze určit pomocí Record.FieldCount funkce. Příklad:

Record.FieldCount([ x = 1, y = 2 })  // 2 
Record.FieldCount([])                // 0

Kromě použití syntaxe [ ]inicializace záznamu lze záznamy vytvořit ze seznamu hodnot a seznam názvů polí nebo typu záznamu. Příklad:

Record.FromList({1, 2}, {"a", "b"})

Výše uvedené hodnoty jsou ekvivalentní:

[ a = 1, b = 2 ]

Pro hodnoty záznamů jsou definovány následující operátory:

Operátor Výsledek
x = y Equal
x <> y Not equal
x & y Sloučení
x ?? y Coalesce

Následující příklady ilustrují výše uvedené operátory. Všimněte si, že sloučení záznamů používá pole z pravého operandu k přepsání polí z levého operandu, pokud by se názvy polí překrývaly.

[ a = 1, b = 2 ] & [ c = 3 ]    // [ a = 1, b = 2, c = 3 ] 
[ a = 1, b = 2 ] & [ a = 3 ]    // [ a = 3, b = 2 ] 
[ a = 1, b = 2 ] = [ b = 2, a = 1 ]         // true 
[ a = 1, b = 2, c = 3 ] <> [ a = 1, b = 2 ] // true

Nativní typ hodnot záznamů je vnitřní typ record, který určuje otevřený prázdný seznam polí.

Table

Hodnota tabulky je seřazená posloupnost řádků. Řádek je uspořádaná posloupnost hodnot sloupců. Typ tabulky určuje délku všech řádků v tabulce, názvy sloupců tabulky, typy sloupců tabulky a strukturu klíčů tabulky (pokud existuje).

Přestože pro tabulky neexistuje žádná syntaxe literálu, k jejich vytvoření se poskytuje několik standardních funkcí knihovny. Tabulky lze také vytvořit pomocí vnitřní funkce #table.

Následující příklad vytvoří tabulku ze seznamu názvů sloupců a seznamu řádků. Výsledná tabulka bude obsahovat dva sloupce type any a tři řádky.

#table({"x", "x^2"}, {{1,1}, {2,4}, {3,9}})

#table lze také použít k zadání úplného typu tabulky:

#table(
    type table [Digit = number, Name = text],  
    {{1,"one"}, {2,"two"}, {3,"three"}} 
    )

Nová hodnota tabulky má typ tabulky, který určuje názvy sloupců a typy sloupců.

Pro hodnoty tabulky jsou definovány následující operátory:

Operátor Výsledek
x = y Equal
x <> y Not equal
x & y Zřetězení
x ?? y Coalesce

Zřetězení tabulky zarovná podobně pojmenované sloupce a vyplní null sloupce zobrazené pouze v jedné z tabulek operandu. Následující příklad znázorňuje zřetězení tabulky:

  #table({"A","B"}, {{1,2}}) 
& #table({"B","C"}, {{3,4}})
A B C
1 2 null
null 3 4

Nativní typ hodnot tabulky je vlastní typ tabulky (odvozený z vnitřního typu table), který uvádí názvy sloupců, určuje všechny typy sloupců, které mají být jakékoli, a nemá žádné klíče. (Přejít na Typy tabulek pro podrobnosti o typech tabulek.)

Function

Hodnota funkce je hodnota, která mapuje sadu argumentů na jednu hodnotu. Podrobnosti o hodnotách funkce jsou popsány ve funkcích.

Typ

Hodnota typu je hodnota, která klasifikuje jiné hodnoty. Podrobnosti o hodnotách typů jsou popsány v typech.