Bagikan melalui


Perilaku operator

Bagian ini mendefinisikan perilaku berbagai operator M.

Prioritas operator

Saat ekspresi berisi beberapa operator, prioritas operator mengontrol urutan operator individu dievaluasi. Misalnya, ekspresi x + y * z dievaluasi sebagai x + (y * z) karena * operator memiliki prioritas yang lebih tinggi daripada operator biner + . Prioritas operator ditetapkan oleh definisi produksi tata bahasa terkait. Misalnya, ekspresi aditif terdiri dari urutan ekspresi multiplikatif yang dipisahkan oleh + atau - operator, sehingga memberikan + operator dan - lebih rendah prioritasnya daripada * operator dan / .

Produksi ekspresi yang dikurung dapat digunakan untuk mengubah urutan prioritas default.

ekspresi tanda kurung:
      ( Ekspresi )

Contohnya:

1 + 2 * 3       // 7 
(1 + 2) * 3     // 9

Tabel berikut ini meringkas operator M, mencantumkan kategori operator dalam urutan prioritas dari tertinggi ke terendah. Operator dalam kategori yang sama memiliki prioritas yang sama.

Kategori Ekspresi Deskripsi
Primer i
@i
Ekspresi pengidentifikasi
(x) Ekspresi yang dikurung
x[i] Pencarian
x{y} Akses item
x(...) Pemanggilan fungsi
{x, y, ...} Inisialisasi daftar
[ i = x, ... ] Inisialisasi rekaman
... Tidak diimplementasikan
Unary +x Identitas
-x Negasi
notx Negasi logis
Metadata x meta y Kaitkan metadata
Perkalian x * y Perkalian
x / y Divisi
Penambahan x + y Tambahan
x - y Pengurangan
Relasional x < y Kurang dari
x > y Lebih besar dari
x <= y Kurang dari atau sama dengan
x >= y Lebih besar dari atau sama dengan
Persamaan x = y Equal
x <> y Tidak sama dengan
Pernyataan jenis x as y Kompatibel dengan jenis atau kesalahan nullable-primitive
Kesuaian jenis x is y Uji apakah kompatibel dengan jenis nullable-primitive
Logika AND x and y Hubungan sirkuit pendek
Logika OR x or y Disjunction sirkuit pendek
Coalesce x ?? y Operator coalescing null

Operator dan metadata

Setiap nilai memiliki nilai rekaman terkait yang dapat membawa informasi tambahan tentang nilai . Rekaman ini disebut sebagai catatan metadata untuk nilai. Rekaman metadata dapat dikaitkan dengan segala jenis nilai, bahkan null. Hasil dari asosiasi tersebut adalah nilai baru dengan metadata yang diberikan.

Rekaman metadata hanyalah rekaman biasa dan dapat berisi bidang dan nilai apa pun yang dapat direkam reguler, dan itu sendiri memiliki catatan metadata. Mengaitkan rekaman metadata dengan nilai adalah "tidak mengganggu". Ini tidak mengubah perilaku nilai dalam evaluasi kecuali untuk mereka yang secara eksplisit memeriksa catatan metadata.

Setiap nilai memiliki catatan metadata default, meskipun belum ditentukan. Catatan metadata default kosong. Contoh berikut menunjukkan mengakses rekaman metadata nilai teks menggunakan Value.Metadata fungsi pustaka standar:

Value.Metadata( "Mozart" )   // []

Rekaman metadata umumnya tidak dipertahankan saat nilai digunakan dengan operator atau fungsi yang membangun nilai baru. Misalnya, jika dua nilai teks digabungkan menggunakan & operator, metadata nilai teks yang dihasilkan adalah catatan []kosong . Ekspresi berikut setara:

"Amadeus " & ("Mozart" meta [ Rating = 5 ])  
"Amadeus " & "Mozart"

Pustaka standar berfungsi Value.RemoveMetadata dan Value.ReplaceMetadata dapat digunakan untuk menghapus semua metadata dari nilai dan untuk mengganti metadata nilai (daripada menggabungkan metadata ke metadata yang mungkin ada).

Satu-satunya operator yang mengembalikan hasil yang membawa metadata adalah operator meta.

Operator rekursif secara struktural

Nilai dapat berupa siklik. Contohnya:

let l = {0, @l} in l
// {0, {0, {0, ... }}}
[A={B}, B={A}]
// [A = {{ ... }}, B = {{ ... }}]

M menangani nilai siklik dengan menjaga konstruksi rekaman, daftar, dan tabel malas. Upaya untuk membangun nilai siklik yang tidak mendapat manfaat dari nilai terstruktur malas yang terinterjeksi menghasilkan kesalahan:

[A=B, B=A] 
// [A = Error.Record("Expression.Error", 
//         "A cyclic reference was encountered during evaluation"), 
//  B = Error.Record("Expression.Error", 
//         "A cyclic reference was encountered during evaluation"), 
// ]

Beberapa operator di M didefinisikan oleh rekursi struktural. Misalnya, kesetaraan rekaman dan daftar didefinisikan oleh kesetaraan yang digabungkan dari bidang rekaman dan daftar item yang sesuai.

Untuk nilai non-siklik, menerapkan rekursi struktural menghasilkan perluasan nilai terbatas: nilai berlapis bersama akan dilalui berulang kali, tetapi proses rekursi selalu berakhir.

Nilai siklik memiliki ekspansi tak terbatas saat menerapkan rekursi struktural. Semantik M tidak membuat akomodasi khusus untuk ekspansi tak terbatas tersebut—upaya untuk membandingkan nilai siklik untuk kesetaraan, misalnya, biasanya akan kehabisan sumber daya dan berakhir dengan luar biasa.

Operator Seleksi dan Proyeksi

Operator pemilihan dan proyeksi memungkinkan data diekstrak dari nilai daftar dan rekaman.

Akses Item

Nilai dapat dipilih dari daftar atau tabel berdasarkan posisi berbasis nol dalam daftar atau tabel tersebut menggunakan ekspresi akses item.

item-access-expression:
      pilihan item
      pilihan item opsional
pemilihan item:
      pemilih item ekspresi
{ utama }
pilihan item opsional:
      pemilih item ekspresi
{ utama } ?
pemilih item:
      Ekspresi

Ekspresi x{y} akses item mengembalikan:

  • Untuk daftar x dan angka y, item daftar x pada posisi y. Item pertama daftar dianggap memiliki indeks ordinal nol. Jika posisi yang diminta tidak ada dalam daftar, kesalahan akan muncul.

  • Untuk tabel x dan angka y, baris tabel x pada posisi y. Baris pertama tabel dianggap memiliki indeks ordinal nol. Jika posisi yang diminta tidak ada dalam tabel, kesalahan akan muncul.

  • Untuk tabel x dan rekaman y, baris tabel x yang cocok dengan nilai bidang rekaman y untuk bidang dengan nama bidang yang cocok dengan nama kolom tabel terkait. Jika tidak ada baris pencocokan unik dalam tabel, kesalahan akan muncul.

Contohnya:

{"a","b","c"}{0}                        // "a" 
{1, [A=2], 3}{1}                        // [A=2] 
{true, false}{2}                        // error 
#table({"A","B"},{{0,1},{2,1}}){0}      // [A=0,B=1] 
#table({"A","B"},{{0,1},{2,1}}){[A=2]}  // [A=2,B=1]  
#table({"A","B"},{{0,1},{2,1}}){[B=3]}  // error 
#table({"A","B"},{{0,1},{2,1}}){[B=1]}  // error

Ekspresi akses item juga mendukung formulir x{y}?, yang mengembalikan null ketika posisi (atau kecocokan) y tidak ada dalam daftar atau tabel x. Jika ada beberapa kecocokan untuk y, kesalahan masih muncul.

Contohnya:

{"a","b","c"}{0}?                       // "a" 
{1, [A=2], 3}{1}?                       // [A=2] 
{true, false}{2}?                       // null 
#table({"A","B"},{{0,1},{2,1}}){0}?     // [A=0,B=1] 
#table({"A","B"},{{0,1},{2,1}}){[A=2]}? // [A=2,B=1]  
#table({"A","B"},{{0,1},{2,1}}){[B=3]}? // null 
#table({"A","B"},{{0,1},{2,1}}){[B=1]}? // error

Akses item tidak memaksa evaluasi item daftar atau tabel selain item yang sedang diakses. Contohnya:

{ error "a", 1, error "c"}{1}  // 1 
{ error "a", error "b"}{1}     // error "b"

Berikut ini berlaku saat operator x{y} akses item dievaluasi:

  • Kesalahan yang dimunculkan selama evaluasi ekspresi x atau y disebarluaskan.

  • Ekspresi x menghasilkan daftar atau nilai tabel.

  • Ekspresi y menghasilkan nilai angka atau, jika x menghasilkan nilai tabel, nilai rekaman.

  • Jika y menghasilkan nilai angka dan nilainya y negatif, kesalahan dengan kode "Expression.Error" alasan dimunculkan.

  • Jika y menghasilkan nilai angka dan nilai y lebih besar dari atau sama dengan jumlah x, kesalahan dengan kode "Expression.Error" alasan dinaikkan kecuali formulir x{y}? operator opsional digunakan, dalam hal ini nilai null dikembalikan.

  • Jika x menghasilkan nilai tabel dan y menghasilkan nilai rekaman dan tidak ada kecocokan untuk y di x, kesalahan dengan kode "Expression.Error" alasan dimunculkan kecuali formulir x{y}? operator opsional digunakan, dalam hal ini nilai null dikembalikan.

  • Jika x menghasilkan nilai tabel dan y menghasilkan nilai rekaman dan ada beberapa kecocokan untuk y di x, kesalahan dengan kode "Expression.Error" alasan dimunculkan.

Tidak ada item selain x yang pada posisi y dievaluasi selama proses pemilihan item. (Untuk daftar atau tabel streaming, item atau baris sebelumnya yang pada posisinya y dilewati, yang dapat menyebabkan evaluasinya, tergantung pada sumber daftar atau tabel.)

Akses Bidang

Ekspresi akses bidang digunakan untuk memilih nilai dari rekaman atau untuk memproyeksikan rekaman atau tabel ke satu dengan bidang atau kolom yang lebih sedikit.

field-access-expression:
      pemilihan bidang
      implisit-target-field-selection
      proyeksi
      proyeksi target implisit
pemilihan bidang:
      pemilih bidang ekspresi utama
pemilih bidang:
      pemilih bidang yang diperlukan
      pemilih bidang opsional
pemilih bidang yang diperlukan:

      [ nama bidang ]
pemilih bidang opsional:
      [ nama bidang ] ?
nama bidang:
      pengidentifikasi umum
      pengidentifikasi kutipan
implisit-target-field-selection:
      pemilih bidang
Proyeksi:
      proyeksi yang diperlukan ekspresi primer
      proyeksi opsional ekspresi primer
proyeksi yang diperlukan:

      [daftar pemilih yang diperlukan ]
proyeksi opsional:
      [daftar pemilih yang diperlukan ] ?
daftar pemilih yang diperlukan:
      pemilih bidang yang diperlukan
      required-selector-list
, required-field-selector
proyeksi target implisit:
      proyeksi yang diperlukan
      proyeksi opsional

Bentuk akses bidang yang paling sederhana diperlukan pemilihan bidang. Ini menggunakan operator x[y] untuk mencari bidang dalam rekaman menurut nama bidang. Jika bidang y tidak ada di x, kesalahan dimunculkan. Formulir x[y]? digunakan untuk melakukan pilihan bidang opsional , dan mengembalikan null jika bidang yang diminta tidak ada dalam rekaman.

Contohnya:

[A=1,B=2][B]       // 2 
[A=1,B=2][C]       // error 
[A=1,B=2][C]?      // null

Akses kolektif dari beberapa bidang didukung oleh operator untuk proyeksi rekaman yang diperlukan dan proyeksi rekaman opsional. Operator x[[y1],[y2],...] memproyeksikan rekaman ke rekaman baru dengan lebih sedikit bidang (dipilih oleh y1, , ...y2). Jika bidang yang dipilih tidak ada, kesalahan akan muncul. Operator x[[y1],[y2],...] memproyeksikan rekaman ke rekaman baru dengan bidang yang dipilih oleh y1, , ...y2; jika bidang hilang, null digunakan sebagai gantinya. Contohnya:

[A=1,B=2][[B]]           // [B=2] 
[A=1,B=2][[C]]           // error 
[A=1,B=2][[B],[C]]?      // [B=2,C=null]

Formulir [y] dan didukung sebagai referensi singkat ke pengidentifikasi _ [y]? (garis bawah). Dua ekspresi berikut setara:

[A]                 
_[A]

Contoh berikut mengilustrasikan bentuk singkat akses bidang:

let _ = [A=1,B=2] in [A] //1

Formulir [[y1],[y2],...] dan [[y1],[y2],...]? juga didukung sebagai singkatan dan dua ekspresi berikut juga setara:

[[A],[B]]                 
_[[A],[B]]

Bentuk singkatan sangat berguna dalam kombinasi dengan each singkatan, cara untuk memperkenalkan fungsi parameter tunggal bernama _ (untuk detailnya, lihat Deklarasi yang disederhanakan). Bersama-sama, dua shorthand menyederhanakan ekspresi fungsi umum dengan urutan lebih tinggi:

List.Select( {[a=1, b=1], [a=2, b=4]}, each [a] = [b]) 
// {[a=1, b=1]}

Ekspresi di atas setara dengan cryptic looking longhand berikut:

List.Select( {[a=1, b=1], [a=2, b=4]}, (_) => _[a] = _[b]) 
// {[a=1, b=1]}

Akses bidang tidak memaksa evaluasi bidang selain bidang yang diakses. Contohnya:

[A=error "a", B=1, C=error "c"][B]  // 1 
[A=error "a", B=error "b"][B]       // error "b"

Berikut ini berlaku saat operator x[y]akses bidang , , x[y]?, x[[y]]atau x[[y]]? dievaluasi:

  • Kesalahan yang dimunculkan selama evaluasi ekspresi x disebarluaskan.

  • Kesalahan yang dimunculkan saat mengevaluasi bidang y secara permanen dikaitkan dengan bidang y, lalu disebarluaskan. Setiap akses ke bidang y di masa mendatang akan memunculkan kesalahan yang identik.

  • Ekspresi x menghasilkan nilai rekaman atau tabel, atau kesalahan dimunculkan.

  • Jika pengidentifikasi y menamai bidang yang tidak ada di x, kesalahan dengan kode "Expression.Error" alasan dinaikkan kecuali formulir ...? operator opsional digunakan, dalam hal ini nilai null dikembalikan.

Tidak ada bidang selain yang dinamai x oleh y dievaluasi selama proses akses bidang.

Operator metadata

Catatan metadata untuk nilai diubah menggunakan operator meta (x meta y).

ekspresi metadata:
      unary-expression
      unary-expression
meta unary-expression

Contoh berikut membuat nilai teks dengan rekaman metadata menggunakan meta operator lalu mengakses rekaman metadata dari nilai yang dihasilkan menggunakan Value.Metadata:

Value.Metadata( "Mozart" meta [ Rating = 5 ] ) 
// [Rating = 5 ]
Value.Metadata( "Mozart" meta [ Rating = 5 ] )[Rating] 
// 5

Berikut ini berlaku saat menerapkan operator x meta ygabungan metadata :

  • Kesalahan yang dimunculkan saat mengevaluasi x ekspresi atau y disebarluaskan.

  • Ekspresi y harus berupa rekaman, atau kesalahan dengan kode "Expression.Error" alasan dimunculkan.

  • Rekaman metadata yang dihasilkan adalah xrekaman metadata yang digabungkan dengan y. (Untuk semantik penggabungan rekaman, lihat Penggabungan rekaman.)

  • Nilai yang dihasilkan adalah nilai dari x ekspresi, tanpa metadatanya, dengan rekaman metadata yang baru dihitung terlampir.

Pustaka standar berfungsi Value.RemoveMetadata dan Value.ReplaceMetadata dapat digunakan untuk menghapus semua metadata dari nilai dan untuk mengganti metadata nilai (daripada menggabungkan metadata ke metadata yang mungkin ada). Ekspresi berikut setara:

x meta y  
Value.ReplaceMetadata(x, Value.Metadata(x) & y) 
Value.RemoveMetadata(x) meta (Value.Metadata(x) & y)

Operator Persamaan

Operator = kesetaraan digunakan untuk menentukan apakah dua nilai sama. Operator ketidaksetaraan <> digunakan untuk menentukan apakah dua nilai tidak sama.

equality-expression:
      relational-expression
      ekspresi-kesetaraan
= ekspresi relasional
      ekspresi-kesetaraan
<> ekspresi relasional

Contohnya:

1 = 1            // true 
1 = 2            // false 
1 <> 1           // false 
1 <> 2           // true 
null = true      // false 
null = null      // true

Metadata bukan bagian dari perbandingan kesetaraan atau ketidaksetaraan. Contohnya:

(1 meta [ a = 1 ]) = (1 meta [ a = 2 ]) // true 
(1 meta [ a = 1 ]) = 1                  // true

Berikut ini berlaku saat menerapkan operator kesetaraan x = y dan x <> y:

  • Kesalahan yang dimunculkan saat mengevaluasi x ekspresi atau y disebarluaskan.

  • Operator = memiliki hasil true jika nilainya sama, dan false sebaliknya.

  • Operator <> memiliki hasil false jika nilainya sama, dan true sebaliknya.

  • Rekaman metadata tidak disertakan dalam perbandingan.

  • Jika nilai yang dihasilkan dengan mengevaluasi x ekspresi dan y bukan jenis nilai yang sama, maka nilainya tidak sama.

  • Jika nilai yang dihasilkan dengan mengevaluasi x ekspresi dan y adalah jenis nilai yang sama, maka ada aturan khusus untuk menentukan apakah nilai tersebut sama, seperti yang didefinisikan di bawah ini.

  • Berikut ini selalu benar:

    (x = y) = not (x <> y)

Operator kesetaraan didefinisikan untuk jenis berikut:

  • Nilainya null hanya sama dengan dirinya sendiri.
    null = null    // true 
    null = true    // false 
    null = false   // false
  • Nilai logika true dan false hanya sama dengan nilai tersebut. Contohnya:
    true = true      // true 
    false = false    // true 
    true = false     // false 
    true = 1         // false
  • Angka dibandingkan menggunakan presisi yang ditentukan:

    • Jika salah satu angka adalah #nan, maka angkanya tidak sama.

    • Ketika tidak ada #nanangka , maka angka dibandingkan menggunakan perbandingan bit-bijaksana dari nilai numerik.

    • #nan adalah satu-satunya nilai yang tidak sama dengan dirinya sendiri.

      Contohnya:

        1 = 1,              // true 
        1.0 = 1             // true 
        2 = 1               // false 
        #nan = #nan         // false 
        #nan <> #nan        // true
  • Dua durasi sama jika mewakili jumlah yang sama dari 100 tanda nanodetik.

  • Dua kali sama jika besarnya bagiannya (jam, menit, detik) sama.

  • Dua tanggal sama jika besaran bagiannya (tahun, bulan, hari) sama.

  • Dua tanggalwaktu sama jika besaran bagiannya (tahun, bulan, hari, jam, menit, detik) sama.

  • Dua zona tanggalwaktu sama jika tanggalwaktu UTC yang sesuai sama. Untuk tiba pada tanggalwaktu UTC yang sesuai, offset jam/menit dikurangi dari komponen tanggalwaktu zona tanggalwaktu.

  • Dua nilai teks sama jika menggunakan perbandingan ordinal, peka huruf besar/kecil, tidak peka terhadap budaya, mereka memiliki panjang dan karakter yang sama pada posisi yang sesuai.

  • Dua nilai daftar sama jika semua nilai berikut ini benar:

    • Kedua daftar berisi jumlah item yang sama.

    • Nilai setiap item yang terkait secara posisional dalam daftar sama. Ini berarti bahwa tidak hanya daftar yang perlu berisi item yang sama, item harus dalam urutan yang sama.

      Contohnya:

        {1, 2} = {1, 2}     // true 
        {2, 1} = {1, 2}     // false 
        {1, 2, 3} = {1, 2}  // false
      
  • Dua rekaman sama jika semua hal berikut ini benar:

    • Jumlah bidang sama.

    • Setiap nama bidang dari satu rekaman juga ada di rekaman lainnya.

    • Nilai setiap bidang dari satu rekaman sama dengan bidang seperti bernama di rekaman lainnya.

      Contohnya:

        [ A = 1, B = 2 ] = [ A = 1, B = 2 ]        // true 
        [ B = 2, A = 1 ] = [ A = 1, B = 2 ]        // true 
        [ A = 1, B = 2, C = 3 ] = [ A = 1, B = 2 ] // false 
        [ A = 1 ] = [ A = 1, B = 2 ]               // false
      
  • Dua tabel sama jika semua tabel berikut ini benar:

    • Jumlah kolom sama.

    • Setiap nama kolom dalam satu tabel juga ada di tabel lainnya.

    • Jumlah baris sama.

    • Setiap baris memiliki nilai yang sama dalam sel yang sesuai.

      Contohnya:

        #table({"A","B"},{{1,2}}) = #table({"A","B"},{{1,2}}) // true 
        #table({"A","B"},{{1,2}}) = #table({"X","Y"},{{1,2}}) // false 
        #table({"A","B"},{{1,2}}) = #table({"B","A"},{{2,1}}) // true
      
  • Nilai fungsi sama dengan dirinya sendiri, tetapi mungkin atau mungkin tidak sama dengan nilai fungsi lain. Jika dua nilai fungsi dianggap sama, maka nilai tersebut akan bersifat identik saat dipanggil.

    Dua nilai fungsi yang diberikan akan selalu memiliki hubungan kesetaraan yang sama.

  • Nilai jenis sama dengan dirinya sendiri, tetapi mungkin atau mungkin tidak sama dengan nilai jenis lain. Jika dua nilai jenis dianggap sama, maka nilai tersebut akan bereaksi identik ketika dikueri untuk kesamaan.

    Dua nilai jenis yang diberikan akan selalu memiliki hubungan kesetaraan yang sama.

Operator relasional

Operator <, >, <=, dan >= disebut operator relasional.

ekspresi relasional:
      additive-expression
      ekspresi aditif
< ekspresi relasional
      ekspresi aditif
> ekspresi relasional
      ekspresi aditif
<= ekspresi relasional
      ekspresi aditif
>= ekspresi relasional

Operator ini digunakan untuk menentukan hubungan pengurutan relatif antara dua nilai, seperti yang ditunjukkan dalam tabel berikut:

Operasi Hasil
x < y true jika x kurang dari y, false jika tidak
x > y true jika x lebih besar dari y, false jika tidak
x <= y true jika x kurang dari atau sama dengan y, false jika tidak
x >= y true jika x lebih besar dari atau sama dengan y, false jika tidak

Contohnya:

0 <= 1            // true 
null < 1          // null 
null <= null      // null 
"ab" < "abc"      // true 
#nan >= #nan      // false  
#nan <= #nan      // false

Berikut ini berlaku saat mengevaluasi ekspresi yang berisi operator relasional:

  • Kesalahan yang dimunculkan saat mengevaluasi x ekspresi atau y operand disebarluaskan.

  • Nilai yang dihasilkan dengan mengevaluasi x ekspresi dan y harus berupa nilai biner, tanggal, tanggalwaktu, zona tanggalwaktu, durasi, logis, angka, null, teks, atau waktu. Jika tidak, kesalahan dengan kode "Expression.Error" alasan dimunculkan.

  • Kedua operan harus jenis nilai yang sama atau null. Jika tidak, kesalahan dengan kode "Expression.Error" alasan dimunculkan.

  • Jika salah satu atau kedua operand adalah null, hasilnya adalah nilainya null .

  • Dua biner dibandingkan byte byte.

  • Dua tanggal dibandingkan dengan membandingkan bagian tahun mereka dan, jika sama, bagian bulan mereka dan, jika sama, bagian hari mereka.

  • Dua tanggalwaktu dibandingkan dengan membandingkan bagian tahun mereka dan, jika sama, bagian bulan mereka dan, jika sama, bagian hari mereka dan, jika sama, bagian jam mereka dan, jika sama, bagian menit mereka dan, jika sama, bagian kedua mereka.

  • Dua zona tanggalwaktu dibandingkan dengan menormalkannya dengan UTC dengan mengurangi offset jam/menitnya lalu membandingkan komponen tanggalwaktunya.

  • Dua durasi dibandingkan sesuai dengan jumlah total 100 tanda nanodetik yang diwakilinya.

  • Dua logika dibandingkan dengan yang true dianggap lebih besar dari false.

  • Dua angka x dan y dibandingkan dengan aturan standar IEEE 754:

    • Jika salah satu operand adalah #nan, hasilnya adalah false untuk semua operator relasional.

    • Ketika tidak ada operand , #nanoperator membandingkan nilai dari dua operand floatingpoint sehubungan dengan urutan -∞ < -max < ... < -min < -0.0 = +0.0 < +min < ... < +max < +∞ di mana min dan maks adalah nilai terbatas positif terkecil dan terbesar yang dapat diwakili. Nama M untuk -∞ dan +∞ adalah -#infinity dan #infinity.

      Efek penting dari pemesanan ini adalah:

      • Nol negatif dan positif dianggap sama.

      • Nilai -#infinity dianggap kurang dari semua nilai angka lainnya, tetapi sama dengan nilai lainnya -#infinity.

      • Nilai #infinity dianggap lebih besar dari semua nilai angka lainnya, tetapi sama dengan nilai lainnya #infinity.

  • Dua teks dibandingkan dengan menggunakan perbandingan ordinal karakter demi karakter, peka huruf besar/kecil, tidak peka terhadap budaya.

  • Dua kali dibandingkan dengan membandingkan bagian jam mereka dan, jika sama, bagian menit mereka dan, jika sama, bagian kedua mereka.

Operator AND logis kondisional

Operator and dan or disebut operator logis kondisional.

logical-or-expression:
      logical-and-expression
logical-and-expression logical-and-expressionorlogical-or-expression
logical-and-expression:
      is-expression
      is-expression
and logical-and-expression

Operator or mengembalikan true ketika setidaknya salah satu operand-nya adalah true. Operand kanan dievaluasi jika dan hanya jika operand kiri bukan true.

Operator and mengembalikan false ketika setidaknya salah satu operand-nya adalah false. Operand kanan dievaluasi jika dan hanya jika operand kiri bukan false.

Tabel kebenaran untuk or operator dan and ditunjukkan di bawah ini, dengan hasil mengevaluasi ekspresi operand kiri pada sumbu vertikal dan hasil mengevaluasi ekspresi operand kanan pada sumbu horizontal.

and true false null error
true true false null error
false false false false false
null null false null error
error error error error error
or true false null error
or true false null error
true true true true true
false true false null error
null true null null error
error error error error error

Berikut ini berlaku saat mengevaluasi ekspresi yang berisi operator logis bersyar:

  • Kesalahan yang dimunculkan saat mengevaluasi x ekspresi atau y disebarluaskan.

  • Operator logis kondisional didefinisikan atas jenis logical dan null. Jika nilai operand bukan dari jenis tersebut, kesalahan dengan kode "Expression.Error" alasan dimunculkan.

  • Hasilnya adalah nilai logis.

  • Dalam ekspresi x atau , ekspresi y akan dievaluasi jika dan hanya jika x tidak mengevaluasi ke truey.

  • Dalam ekspresi x dan , ekspresi y akan dievaluasi jika dan hanya jika x tidak mengevaluasi ke falsey.

Dua properti terakhir memberi operator logis kondisional kualifikasi "kondisional" mereka; properti juga disebut sebagai "short-circuiting". Properti ini berguna untuk menulis predikat yang dijaga dengan ringkas. Misalnya, ekspresi berikut setara:

d <> 0 and n/d > 1 if d <> 0 then n/d > 1 else false

Operasi Aritmatika

Operator +, -, * dan / adalah operator aritmatika.

ekspresi aditif:
      multiplicative-expression
      ekspresi aditif
+ ekspresi multiplikatif
      ekspresi aditif
- ekspresi multiplikatif
multiplicative-expression:
      metadata- ekspresi
      ekspresi metadata multiplicative-expression
*
      ekspresi metadata multiplicative-expression
/

Presisi

Angka dalam M disimpan menggunakan berbagai representasi untuk menyimpan informasi sebanyak mungkin tentang angka yang berasal dari berbagai sumber. Angka hanya dikonversi dari satu representasi ke representasi lain sesuai kebutuhan operator yang diterapkan padanya. Dua presisi didukung dalam M:

Presisi Semantik
Precision.Decimal Representasi desimal 128-bit dengan rentang digit signifikan ±1,0 x 10-28 hingga ±7,9 x 1028 dan 28-29.
Precision.Double Representasi ilmiah menggunakan mantissa dan eksponen; sesuai dengan standar aritmatika IEEE 754 presisi ganda biner 64-bit IEEE 754-2008.

Operasi aritmatika dilakukan dengan memilih presisi, mengonversi kedua operan ke presisi tersebut (jika perlu), lalu melakukan operasi aktual, dan akhirnya mengembalikan angka dalam presisi yang dipilih.

Operator aritmetika bawaan (+, , -*, ) /menggunakan Presisi Ganda. Fungsi pustaka standar (Value.Add, Value.Subtract, Value.Multiply, Value.Divide) dapat digunakan untuk meminta operasi ini menggunakan model presisi tertentu.

  • Tidak ada luapan numerik yang dimungkinkan: #infinity atau -#infinity mewakili nilai besaran yang terlalu besar untuk diwakili.

  • Tidak ada aliran bawah numerik yang dimungkinkan: 0 dan -0 mewakili nilai besaran terlalu kecil untuk diwakili.

  • Nilai #nan khusus IEEE 754 (NaN—Bukan Angka) digunakan untuk mencakup kasus yang tidak valid secara aritmetis, seperti pembagian nol dengan nol.

  • Konversi dari Presisi Desimal ke Ganda dilakukan dengan membulatkan angka desimal ke nilai ganda terdekat yang setara.

  • Konversi dari presisi Ganda ke Desimal dilakukan dengan membulatkan angka ganda ke nilai desimal terdekat yang setara dan, jika perlu, meluap ke #infinity atau -#infinity nilai.

Operator tambahan

Interpretasi operator penambahan (x + y) tergantung pada jenis nilai ekspresi x dan y yang dievaluasi, sebagai berikut:

x y Hasil Interpretasi
type number type number type number Jumlah numerik
type number null null
null type number null
type duration type duration type duration Jumlah numerik besaran
type duration null null
null type duration null
typetanggalwaktu type duration typetanggalwaktu Offset tanggalwaktu menurut durasi
type duration typetanggalwaktu typetanggalwaktu
typetanggalwaktu null null
null typetanggalwaktu null

Dalam tabel, type datetime adalah singkatan dari type date, , type datetime, type datetimezoneatau type time. Saat menambahkan durasi dan nilai beberapa jenis tanggalwaktu, nilai yang dihasilkan adalah jenis yang sama.

Untuk kombinasi nilai lain daripada yang tercantum dalam tabel, kesalahan dengan kode "Expression.Error" alasan dimunculkan. Setiap kombinasi tercakup dalam bagian berikut.

Kesalahan yang dimunculkan saat mengevaluasi salah satu operand disebarluaskan.

Jumlah numerik

Jumlah dua angka dihitung menggunakan operator penambahan, menghasilkan angka.

Contohnya:

1 + 1             // 2 
#nan + #infinity  // #nan

Operator + tambahan atas angka menggunakan Presisi Ganda; fungsi Value.Add pustaka standar dapat digunakan untuk menentukan Presisi Desimal. Berikut ini berlaku saat menghitung jumlah angka:

  • Jumlah dalam Presisi Ganda dihitung sesuai dengan aturan 64-bit biner doubleprecision IEEE 754 aritmatika IEEE 754-2008. Tabel berikut mencantumkan hasil semua kemungkinan kombinasi nilai terbatas nonzero, nol, tak terbatas, dan NaN. Dalam tabel, x dan y merupakan nilai terbatas bukan nol, dan z merupakan hasil dari x + y. Jika x dan y memiliki besaran yang sama tetapi tanda-tanda yang berlawanan, z adalah nol positif. Jika x + y terlalu besar untuk diwakili dalam jenis tujuan, z adalah tak terbatas dengan tanda yang sama dengan x + y.

    + y +0 0- +∞ -∞ NaN
    x z x x +∞ -∞ NaN
    +0 y +0 +0 +∞ -∞ NaN
    -0 y +0 0- +∞ -∞ NaN
    +∞ +∞ +∞ +∞ +∞ NaN NaN
    -∞ -∞ -∞ -∞ NaN -∞ NaN
    NaN NaN NaN NaN NaN NaN NaN
  • Jumlah Presisi Desimal dihitung tanpa kehilangan presisi. Skala hasilnya lebih besar dari skala dua operand.

Jumlah durasi

Jumlah dua durasi adalah durasi yang menunjukkan jumlah jumlah 100nanodetik tick yang diwakili oleh durasi. Contohnya:

#duration(2,1,0,15.1) + #duration(0,1,30,45.3) 
// #duration(2, 2, 31, 0.4)

Offset tanggalwaktu menurut durasi

Tanggalwaktu dan durasi y dapat ditambahkan menggunakan x + y untuk menghitung tanggalwaktu baru yang jaraknya dari x pada garis waktu linier adalah besarnya y. x Di sini, datetime adalah singkatan dari , Date, DateTimeZoneDateTime, atau Time dan hasil non-null akan memiliki jenis yang sama. Offset tanggalwaktu menurut durasi dapat dihitung sebagai berikut:

  • Jika hari tanggalwaktu sejak nilai epoch ditentukan, buat tanggalwaktu baru dengan elemen informasi berikut:

    • Hitung hari baru sejak epoch yang setara dengan pembagian besaran y dengan jumlah kutu 100 nanodetik dalam periode 24 jam, memotong bagian desimal hasil, dan menambahkan nilai ini ke hari x sejak zaman.

    • Hitung kutu baru sejak tengah malam yang setara dengan menambahkan besarnya y ke kutu x sejak tengah malam, modulo jumlah 100 tanda nanodetik dalam periode 24 jam. Jika x tidak menentukan nilai untuk kutu sejak tengah malam, nilai 0 diasumsikan.

    • Salin nilai x untuk offset menit dari UTC yang tidak berubah.

  • Jika hari tanggalwaktu sejak nilai epoch tidak ditentukan, buat tanggalwaktu baru dengan elemen informasi berikut yang ditentukan:

    • Hitung kutu baru sejak tengah malam yang setara dengan menambahkan besarnya y ke kutu x sejak tengah malam, modulo jumlah 100 tanda nanodetik dalam periode 24 jam. Jika x tidak menentukan nilai untuk kutu sejak tengah malam, nilai 0 diasumsikan.

    • Salin nilai x selama ber hari sejak epoch dan menit offset dari UTC tidak berubah.

Contoh berikut menunjukkan pengkalkulasian jumlah temporal absolut ketika tanggalwaktu menentukan hari sejak zaman:

#date(2010,05,20) + #duration(0,8,0,0) 
    //#datetime( 2010, 5, 20, 8, 0, 0 ) 
    //2010-05-20T08:00:00 
 
#date(2010,01,31) + #duration(30,08,0,0) 
    //#datetime(2010, 3, 2, 8, 0, 0) 
    //2010-03-02T08:00:00 
 
#datetime(2010,05,20,12,00,00,-08) + #duration(0,04,30,00) 
    //#datetime(2010, 5, 20, 16, 30, 0, -8, 0) 
    //2010-05-20T16:30:00-08:00 
 
#datetime(2010,10,10,0,0,0,0) + #duration(1,0,0,0) 
   //#datetime(2010, 10, 11, 0, 0, 0, 0, 0) 
   //2010-10-11T00:00:00+00:00

Contoh berikut menunjukkan pengkalkulasian offset tanggalwaktu menurut durasi untuk waktu tertentu:

#time(8,0,0) + #duration(30,5,0,0) 
   //#time(13, 0, 0) 
   //13:00:00

Operasi pengurangan

Interpretasi operator pengurangan (x - y) tergantung pada jenis nilai ekspresi x yang dievaluasi dan y, sebagai berikut:

x Y Hasil Interpretasi
type number type number type number Perbedaan numerik
type number null null
null type number null
type duration type duration type duration Perbedaan numerik besaran
type duration null null
null type duration null
typetanggalwaktu typetanggalwaktu type duration Durasi antara tanggalwaktu
typetanggalwaktu type duration typetanggalwaktu Offset tanggalwaktu dengan durasi yang dinegasikan
typetanggalwaktu null null
null typetanggalwaktu null

Dalam tabel, type datetime adalah singkatan dari type date, , type datetime, type datetimezoneatau type time. Saat mengurangi durasi dari nilai beberapa jenis tanggalwaktu, nilai yang dihasilkan adalah jenis yang sama.

Untuk kombinasi nilai lain daripada yang tercantum dalam tabel, kesalahan dengan kode "Expression.Error" alasan dimunculkan. Setiap kombinasi tercakup dalam bagian berikut.

Kesalahan yang dimunculkan saat mengevaluasi salah satu operand disebarluaskan.

Perbedaan numerik

Perbedaan antara dua angka dihitung menggunakan operator pengurangan, menghasilkan angka. Contohnya:

1 - 1                // 0 
#nan - #infinity     // #nan

Operator - pengurangan atas angka menggunakan Presisi Ganda; fungsi Value.Subtract pustaka standar dapat digunakan untuk menentukan Presisi Desimal. Berikut ini berlaku saat menghitung perbedaan angka:

  • Perbedaan Presisi Ganda dihitung sesuai dengan aturan presisi ganda biner 64-bit IEEE 754 aritmetika IEEE 754-2008. Tabel berikut mencantumkan hasil semua kemungkinan kombinasi nilai terbatas nonzero, nol, tak terbatas, dan NaN. Dalam tabel, x dan y merupakan nilai terbatas bukan nol, dan z merupakan hasil dari x - y. Jika x dan y sama, z adalah nol positif. Jika x - y terlalu besar untuk diwakili dalam jenis tujuan, z adalah tak terbatas dengan tanda yang sama dengan x - y.

    - y +0 0- +∞ -∞ NaN
    x z x x -∞ +∞ NaN
    +0 -y +0 +0 -∞ +∞ NaN
    -0 -y 0- +0 -∞ +∞ NaN
    +∞ +∞ +∞ +∞ NaN +∞ NaN
    -∞ -∞ -∞ -∞ -∞ NaN NaN
    NaN NaN NaN NaN NaN NaN NaN
  • Perbedaan Presisi Desimal dihitung tanpa kehilangan presisi. Skala hasilnya lebih besar dari skala dua operand.

Perbedaan durasi

Perbedaan dua durasi adalah durasi yang menunjukkan perbedaan antara jumlah 100 tanda nanodetik yang diwakili oleh setiap durasi. Contohnya:

#duration(1,2,30,0) - #duration(0,0,0,30.45) 
// #duration(1, 2, 29, 29.55)

Offset tanggalwaktu dengan durasi yang dinegasikan

Tanggalwaktu x dan durasi y dapat dikurangi menggunakan x - y untuk menghitung tanggalwaktu baru. Di sini, datetime adalah singkatan dari date, , datetime, atau .timedatetimezone Tanggalwaktu yang dihasilkan memiliki jarak dari x pada garis waktu linier yang tepat besarnya y, ke arah yang berlawanan ydengan tanda . Mengurangi durasi positif menghasilkan hasil yang mundur dalam waktu relatif terhadap x, sementara mengurangi nilai negatif menghasilkan hasil yang diteruskan tepat waktu.

#date(2010,05,20) - #duration(00,08,00,00) 
   //#datetime(2010, 5, 19, 16, 0, 0) 
   //2010-05-19T16:00:00 
#date(2010,01,31) - #duration( 30,08,00,00) 
   //#datetime(2009, 12, 31, 16, 0, 0) 
   //2009-12-31T16:00:00

Durasi antara dua tanggalwaktu

Dua tanggalwaktu t dan u dapat dikurangi menggunakan t - u untuk menghitung durasi di antara mereka. Di sini, datetime adalah singkatan dari date, , datetime, atau .timedatetimezone Durasi yang dihasilkan dengan mengurangi u dari harus menghasilkan t ketika ditambahkan ke ut .

#date(2010,01,31) - #date(2010,01,15) 
// #duration(16,00,00,00) 
// 16.00:00:00 
 
#date(2010,01,15)- #date(2010,01,31) 
// #duration(-16,00,00,00) 
// -16.00:00:00 
 
#datetime(2010,05,20,16,06,00,-08,00) - 
#datetime(2008,12,15,04,19,19,03,00) 
// #duration(521,22,46,41)
// 521.22:46:41

Mengurangi t - u saat u > t menghasilkan durasi negatif:

#time(01,30,00) - #time(08,00,00) 
// #duration(0, -6, -30, 0)

Berikut ini berlaku saat mengurangi dua tanggalwaktu menggunakan t - u:

  • u + (t - u) = t

operasi perkalian

Interpretasi operator perkalian (x * y) tergantung pada jenis nilai ekspresi x dan y yang dievaluasi, sebagai berikut:

X Y Hasil Interpretasi
type number type number type number Produk numerik
type number null null
null type number null
type duration type number type duration Kelipatan durasi
type number type duration type duration Kelipatan durasi
type duration null null
null type duration null

Untuk kombinasi nilai lain daripada yang tercantum dalam tabel, kesalahan dengan kode "Expression.Error" alasan dimunculkan. Setiap kombinasi tercakup dalam bagian berikut.

Kesalahan yang dimunculkan saat mengevaluasi salah satu operand disebarluaskan.

Produk numerik

Produk dari dua angka dihitung menggunakan operator perkalian, menghasilkan angka. Contohnya:

2 * 4                // 8 
6 * null             // null 
#nan * #infinity     // #nan

Operator * perkalian atas angka menggunakan Presisi Ganda; fungsi Value.Multiply pustaka standar dapat digunakan untuk menentukan Presisi Desimal. Berikut ini berlaku saat menghitung produk angka:

  • Produk dalam Presisi Ganda dihitung sesuai dengan aturan 64-bit biner presisi ganda IEEE 754 aritmatika IEEE 754-2008. Tabel berikut mencantumkan hasil semua kemungkinan kombinasi nilai terbatas nonzero, nol, tak terbatas, dan NaN. Dalam tabel, x dan y merupakan nilai terbatas positif. z adalah hasil dari x * y. Jika hasilnya terlalu besar untuk jenis tujuan, z tidak terbatas. Jika hasilnya terlalu kecil untuk jenis tujuan, z adalah nol.

    * +y -y +0 0- +∞ -∞ NaN
    +x +z -z +0 0- +∞ -∞ NaN
    -x -z +z 0- +0 -∞ +∞ NaN
    +0 +0 0- +0 0- NaN NaN NaN
    -0 0- +0 0- +0 NaN NaN NaN
    +∞ +∞ -∞ NaN NaN +∞ -∞ NaN
    -∞ -∞ +∞ NaN NaN -∞ +∞ NaN
    NaN NaN NaN NaN NaN NaN NaN NaN
  • Produk dalam Presisi Desimal dihitung tanpa kehilangan presisi. Skala hasilnya lebih besar dari skala dua operand.

Kelipatan durasi

Produk dari durasi dan angka adalah durasi yang menunjukkan jumlah 100nanodetik tick yang diwakili oleh durasi operand kali operand angka. Contohnya:

#duration(2,1,0,15.1) * 2 
// #duration(4, 2, 0, 30.2)

Operator pembagian

Interpretasi operator divisi (x / y) tergantung pada jenis nilai ekspresi x yang dievaluasi dan y, sebagai berikut:

X Y Hasil Interpretasi
type number type number type number Kuota numerik
type number null null
null type number null
type duration type number type duration Pecahan durasi
type duration type duration type number Kuota numerik durasi
type duration null null
null type duration null

Untuk kombinasi nilai lain daripada yang tercantum dalam tabel, kesalahan dengan kode "Expression.Error" alasan dimunculkan. Setiap kombinasi tercakup dalam bagian berikut.

Kesalahan yang dimunculkan saat mengevaluasi salah satu operand disebarluaskan.

Kuota numerik

Kuota dua angka dihitung menggunakan operator divisi, menghasilkan angka. Contohnya:

8 / 2               // 4 
8 / 0               // #infinity 
0 / 0               // #nan 
0 / null            // null 
#nan / #infinity    // #nan

Operator / divisi atas angka menggunakan Presisi Ganda; fungsi Value.Divide pustaka standar dapat digunakan untuk menentukan Presisi Desimal. Berikut ini berlaku saat menghitung kuota angka:

  • Kuota dalam Presisi Ganda dihitung sesuai dengan aturan 64-bit biner presisi ganda IEEE 754 aritmetika IEEE 754-2008. Tabel berikut mencantumkan hasil semua kemungkinan kombinasi nilai terbatas nonzero, nol, tak terbatas, dan NaN. Dalam tabel, x dan y merupakan nilai terbatas positif. z adalah hasil dari x / y. Jika hasilnya terlalu besar untuk jenis tujuan, z tidak terbatas. Jika hasilnya terlalu kecil untuk jenis tujuan, z adalah nol.

    / +y -y +0 0- +∞ -∞ NaN
    +x +z -z +∞ -∞ +0 0- NaN
    -x -z +z -∞ +∞ 0- +0 NaN
    +0 +0 0- NaN NaN +0 0- NaN
    -0 0- +0 NaN NaN 0- +0 NaN
    +∞ +∞ -∞ +∞ -∞ NaN NaN NaN
    -∞ -∞ +∞ -∞ +∞ NaN NaN NaN
    NaN NaN NaN NaN NaN NaN NaN NaN
  • Jumlah Presisi Desimal dihitung tanpa kehilangan presisi. Skala hasilnya lebih besar dari skala dua operand.

Kuota durasi

Kuota dua durasi adalah angka yang menunjukkan kuota jumlah 100nanosecond tick yang diwakili oleh durasi. Contohnya:

#duration(2,0,0,0) / #duration(0,1,30,0) 
// 32

Durasi berskala

Kuota durasi x dan angka y adalah durasi yang menunjukkan kuota jumlah 100 tanda centang nanodetik yang diwakili oleh durasi x dan angka y. Contohnya:

#duration(2,0,0,0) / 32 
// #duration(0,1,30,0)

Kombinasi Struktur

Operator kombinasi (x & y) didefinisikan melalui jenis nilai berikut:

X Y Hasil Interpretasi
type text type text type text Rangkaian
type text null null
null type text null
type date type time type datetime Penggabungan
type date null null
null type time null
type list type list type list Rangkaian
type record type record type record Penggabungan
type table type table type table Rangkaian

Rangkaian

Dua teks, dua daftar, atau dua nilai tabel dapat digabungkan menggunakan x & y.

Contoh berikut mengilustrasikan menggabungkan nilai teks:

"AB" & "CDE"     // "ABCDE"

Contoh berikut mengilustrasikan daftar penggandaan:

{1, 2} & {3}     // {1, 2, 3}

Berikut ini berlaku saat menggabungkan dua nilai menggunakan x & y:

  • Kesalahan yang dimunculkan saat mengevaluasi x ekspresi atau y disebarluaskan.

  • Tidak ada kesalahan yang disebarluaskan jika item salah satu x atau y berisi kesalahan.

  • Hasil penggandaan dua nilai teks adalah nilai teks yang berisi nilai x segera diikuti oleh y. Jika salah satu operand null dan yang lainnya adalah nilai teks, hasilnya null.

  • Hasil dari menggabungkan dua daftar adalah daftar yang berisi semua item x diikuti oleh semua item y.

  • Hasil dari menggabungkan dua tabel adalah tabel yang memiliki gabungan dari dua kolom tabel operand. Urutan x kolom dipertahankan, diikuti oleh kolom hanya muncul di y, mempertahankan pengurutan relatifnya. Untuk kolom yang hanya muncul di salah satu operand, null digunakan untuk mengisi nilai sel untuk operand lainnya.

Penggabungan

Penggabungan rekaman

Dua rekaman dapat digabungkan menggunakan x & y, menghasilkan rekaman yang menyertakan bidang dari dan x y.

Contoh berikut mengilustrasikan penggabungan rekaman:

[ x = 1 ] & [ y = 2 ]                // [ x = 1, y = 2 ] 
[ x = 1, y = 2 ] & [ x = 3, z = 4 ]  // [ x = 3, y = 2, z = 4 ]

Berikut ini berlaku saat menggabungkan dua rekaman menggunakan x + y:

  • Kesalahan yang dimunculkan saat mengevaluasi x ekspresi atau y disebarluaskan.

  • Jika bidang muncul di dan x y, nilai dari y digunakan.

  • Urutan bidang dalam rekaman yang dihasilkan adalah dari x, diikuti oleh bidang di y yang bukan bagian xdari , dalam urutan yang sama seperti yang muncul di y.

  • Menggabungkan rekaman tidak menyebabkan evaluasi nilai.

  • Tidak ada kesalahan yang dimunculkan karena bidang berisi kesalahan.

  • Hasilnya adalah rekaman.

Penggabungan tanggal-waktu

Tanggal x dapat digabungkan dengan waktu y menggunakan x & y, menghasilkan tanggalwaktu yang menggabungkan bagian dari dan x y.

Contoh berikut mengilustrasikan penggabungan tanggal dan waktu:

#date(2013,02,26) & #time(09,17,00) 
// #datetime(2013,02,26,09,17,00)

Berikut ini berlaku saat menggabungkan dua rekaman menggunakan x + y:

  • Kesalahan yang dimunculkan saat mengevaluasi x ekspresi atau y disebarluaskan.

  • Hasilnya adalah tanggalwaktu.

Operator Tunggal

Operator +, -, dan not adalah operator unary.

unary-expression:
      type-expression

      +ekspresi unary
      -ekspresi unary
      notekspresi unary

Operator tunggal plus

Operator unary plus (+x) didefinisikan untuk jenis nilai berikut:

X Hasil Interpretasi
type number type number Nilai tambah unary
type duration type duration Nilai tambah unary
null 'null

Untuk nilai lain, kesalahan dengan kode "Expression.Error" alasan dimunculkan.

Operator unary plus memungkinkan + tanda diterapkan ke angka, tanggalwaktu, atau nilai null. Hasilnya adalah nilai yang sama. Contohnya:

+ - 1                 // -1 
+ + 1                 // 1 
+ #nan                // #nan 
+ #duration(0,1,30,0) // #duration(0,1,30,0)

Berikut ini berlaku saat mengevaluasi operator +xunary plus :

  • Kesalahan yang dimunculkan saat mengevaluasi x disebarluaskan.

  • Jika hasil evaluasi x bukan nilai angka, maka kesalahan dengan kode "Expression.Error" alasan dimunculkan.

Operasi minus tunggal

Operator minus unary (-x) didefinisikan untuk jenis nilai berikut:

X Hasil Interpretasi
type number type number Negasi
type duration type duration Negasi
null null

Untuk nilai lain, kesalahan dengan kode "Expression.Error" alasan dimunculkan.

Operator minus unary digunakan untuk mengubah tanda angka atau durasi. Contohnya:

- (1 + 1)       // -2 
- - 1           // 1 
- - - 1         // -1 
- #nan          // #nan 
- #infinity     // -#infinity 
- #duration(1,0,0,0)  // #duration(-1,0,0,0) 
- #duration(0,1,30,0) // #duration(0,-1,-30,0)

Berikut ini berlaku saat mengevaluasi operator -xminus unary :

  • Kesalahan yang dimunculkan saat mengevaluasi x disebarluaskan.

  • Jika ekspresi adalah angka, maka hasilnya adalah nilai angka dari ekspresi x dengan tandanya berubah. Jika nilainya adalah NaN, maka hasilnya juga NaN.

Operator logika negasi

Operator negasi logis (not) didefinisikan untuk jenis nilai berikut:

X Hasil Interpretasi
type logical type logical Negasi
null null

Operator ini menghitung operasi logis not pada nilai logis tertentu. Contohnya:

not true             // false 
not false            // true 
not (true and true)  // false

Berikut ini berlaku saat mengevaluasi operator not xnegasi logis :

  • Kesalahan yang dimunculkan saat mengevaluasi x disebarluaskan.

  • Nilai yang dihasilkan dari ekspresi evaluasi x harus berupa nilai logis, atau kesalahan dengan kode "Expression.Error" alasan harus dimunculkan. Jika nilainya adalah true, hasilnya adalah false. Jika operand adalah false, hasilnya adalah true.

Hasilnya adalah nilai logis.

Operator jenis

Operator is dan as dikenal sebagai operator jenis.

Ketik operator kompatibilitas

Operator x is y kompatibilitas jenis didefinisikan untuk jenis nilai berikut:

X Y Hasil
type any nullable-primitive-type type logical

Ekspresi x is y mengembalikan jika jenis x ascribed kompatibel dengan y, dan mengembalikan false jika jenis x ascribed tidak kompatibel dengan ytrue . y harus berupa nullable-primitivetype.

is-expression:
      as-expression
      is-expression
is nullable-primitive-type
nullable-primitive-type:

      nullableopt primitif-type

Kompatibilitas jenis, seperti yang didukung oleh is operator, adalah subset kompatibilitas jenis umum dan didefinisikan menggunakan aturan berikut:

  • Jika x null maka kompatibel jika y adalah jenis any, jenis null, atau jenis nullable.

  • Jika x non-null maka jika kompatibel jika jenis x primitifnya sama dengan y.

Berikut ini berlaku saat mengevaluasi ekspresi x is y:

  • Kesalahan yang dimunculkan saat mengevaluasi ekspresi x disebarluaskan.

Operator pernyataan jenis

Operator x as y pernyataan jenis didefinisikan untuk jenis nilai berikut:

X Y Hasil
type any nullable-primitive-type type any

Ekspresi x as y menegaskan bahwa nilai x kompatibel dengan y sesuai is operator. Jika tidak kompatibel, kesalahan akan muncul. y harus berupa tipe nullable-primitive.

as-expression:
      ekspresi kesetaraan
      as-expression
as nullable-primitive-type

Ekspresi x as y dievaluasi sebagai berikut:

  • Pemeriksaan x is y kompatibilitas jenis dilakukan dan pernyataan mengembalikan x tidak berubah jika pengujian tersebut berhasil.

  • Jika pemeriksaan kompatibilitas gagal, kesalahan dengan kode "Expression.Error" alasan dimunculkan.

Contoh:

1 as number               // 1 
"A" as number             // error 
null as nullable number   // null

Berikut ini berlaku saat mengevaluasi ekspresi x as y:

  • Kesalahan yang dimunculkan saat mengevaluasi ekspresi x disebarluaskan.

Operator coalesce

Operator coalesce ?? mengembalikan hasil operand kirinya jika tidak null, jika tidak, operator tersebut akan mengembalikan hasil operand kanannya. Operand kanan dievaluasi jika dan hanya jika operand kiri null.