Perilaku operator
Bagian ini mendefinisikan perilaku berbagai operator M.
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 /
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 | |
not
x |
Negasi logis | |
Metadata |
xmeta 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 |
xas y |
Kompatibel dengan jenis atau kesalahan nullable-primitive |
Kesuaian jenis |
xis y |
Uji apakah kompatibel dengan jenis nullable-primitive |
Logika AND |
xand y |
Hubungan sirkuit pendek |
Logika OR |
xor y |
Disjunction sirkuit pendek |
Coalesce |
x?? y |
Operator coalescing null |
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.
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 pemilihan dan proyeksi memungkinkan data diekstrak dari nilai daftar dan rekaman.
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 angkay
, item daftarx
pada posisiy
. Item pertama daftar dianggap memiliki indeks ordinal nol. Jika posisi yang diminta tidak ada dalam daftar, kesalahan akan muncul.Untuk tabel
x
dan angkay
, baris tabelx
pada posisiy
. Baris pertama tabel dianggap memiliki indeks ordinal nol. Jika posisi yang diminta tidak ada dalam tabel, kesalahan akan muncul.Untuk tabel
x
dan rekamany
, baris tabelx
yang cocok dengan nilai bidang rekamany
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
atauy
disebarluaskan.Ekspresi
x
menghasilkan daftar atau nilai tabel.Ekspresi
y
menghasilkan nilai angka atau, jikax
menghasilkan nilai tabel, nilai rekaman.Jika
y
menghasilkan nilai angka dan nilainyay
negatif, kesalahan dengan kode"Expression.Error"
alasan dimunculkan.Jika
y
menghasilkan nilai angka dan nilaiy
lebih besar dari atau sama dengan jumlahx
, kesalahan dengan kode"Expression.Error"
alasan dinaikkan kecuali formulirx{y}?
operator opsional digunakan, dalam hal ini nilainull
dikembalikan.Jika
x
menghasilkan nilai tabel dany
menghasilkan nilai rekaman dan tidak ada kecocokan untuky
dix
, kesalahan dengan kode"Expression.Error"
alasan dimunculkan kecuali formulirx{y}?
operator opsional digunakan, dalam hal ini nilainull
dikembalikan.Jika
x
menghasilkan nilai tabel dany
menghasilkan nilai rekaman dan ada beberapa kecocokan untuky
dix
, 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.)
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 [y]?
ke pengidentifikasi _
(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 bidangy
, lalu disebarluaskan. Setiap akses ke bidangy
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 dix
, kesalahan dengan kode"Expression.Error"
alasan dinaikkan kecuali formulir...?
operator opsional digunakan, dalam hal ini nilainull
dikembalikan.
Tidak ada bidang selain yang dinamai x
oleh y
dievaluasi selama proses akses bidang.
Catatan metadata untuk nilai diubah menggunakan operator meta (x meta y
).
ekspresi metadata:
unary-expression
unary-expressionmeta
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 y
gabungan metadata :
Kesalahan yang dimunculkan saat mengevaluasi
x
ekspresi atauy
disebarluaskan.Ekspresi
y
harus berupa rekaman, atau kesalahan dengan kode"Expression.Error"
alasan dimunculkan.Rekaman metadata yang dihasilkan adalah
x
rekaman metadata yang digabungkan dengany
. (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 =
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 atauy
disebarluaskan.Operator
=
memiliki hasiltrue
jika nilainya sama, danfalse
sebaliknya.Operator
<>
memiliki hasilfalse
jika nilainya sama, dantrue
sebaliknya.Rekaman metadata tidak disertakan dalam perbandingan.
Jika nilai yang dihasilkan dengan mengevaluasi
x
ekspresi dany
bukan jenis nilai yang sama, maka nilainya tidak sama.Jika nilai yang dihasilkan dengan mengevaluasi
x
ekspresi dany
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
danfalse
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
#nan
angka , 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 <
, >
, <=
, 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 atauy
operand disebarluaskan.Nilai yang dihasilkan dengan mengevaluasi
x
ekspresi dany
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 nilainyanull
.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 darifalse
.Dua angka
x
dany
dibandingkan dengan aturan standar IEEE 754:Jika salah satu operand adalah
#nan
, hasilnya adalahfalse
untuk semua operator relasional.Ketika tidak ada operand ,
#nan
operator 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
dan or
disebut operator logis kondisional.
logical-or-expression:
logical-and-expression
logical-and-expression logical-and-expressionor
logical-or-expression
logical-and-expression:
is-expression
is-expressionand
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 atauy
disebarluaskan.Operator logis kondisional didefinisikan atas jenis
logical
dannull
. Jika nilai operand bukan dari jenis tersebut, kesalahan dengan kode"Expression.Error"
alasan dimunculkan.Hasilnya adalah nilai logis.
Dalam ekspresi
x
atau , ekspresiy
akan dievaluasi jika dan hanya jikay
tidak mengevaluasi kex
true
.Dalam ekspresi
x
dan , ekspresiy
akan dievaluasi jika dan hanya jikay
tidak mengevaluasi kex
false
.
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
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/
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.
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 |
|
type
tanggalwaktu |
type duration |
type
tanggalwaktu |
Offset tanggalwaktu menurut durasi |
type duration |
type
tanggalwaktu |
type
tanggalwaktu |
|
type
tanggalwaktu |
null |
null |
|
null |
type
tanggalwaktu |
null |
Dalam tabel, type
datetime adalah singkatan dari type date
, , type datetime
, type datetimezone
atau 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 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
dany
merupakan nilai terbatas bukan nol, danz
merupakan hasil darix + y
. Jikax
dany
memiliki besaran yang sama tetapi tanda-tanda yang berlawanan,z
adalah nol positif. Jikax + y
terlalu besar untuk diwakili dalam jenis tujuan,z
adalah tak terbatas dengan tanda yang sama denganx + 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 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)
Tanggalwaktu dan durasi dapat ditambahkan menggunakan x
untuk menghitung tanggalwaktuy
yang jaraknya dari x + y
pada garis waktu linier adalah besarnya .y
Di sini, datetime adalah singkatan dari , Date
, DateTime
DateTimeZone
, 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
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 |
|
type
tanggalwaktu |
type
tanggalwaktu |
type duration |
Durasi antara tanggalwaktu |
type
tanggalwaktu |
type duration |
type
tanggalwaktu |
Offset tanggalwaktu dengan durasi yang dinegasikan |
type
tanggalwaktu |
null |
null |
|
null |
type
tanggalwaktu |
null |
Dalam tabel, type
datetime adalah singkatan dari type date
, , type datetime
, type datetimezone
atau 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 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
dany
merupakan nilai terbatas bukan nol, danz
merupakan hasil darix - y
. Jikax
dany
sama,z
adalah nol positif. Jikax - y
terlalu besar untuk diwakili dalam jenis tujuan,z
adalah tak terbatas dengan tanda yang sama denganx - 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 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)
Tanggalwaktu dan durasi x
dapat dikurangi menggunakan y
untuk menghitung tanggalwaktux - y
. Di sini, datetime adalah singkatan dari date
, , datetime
, atau .datetimezone
time
Tanggalwaktu yang dihasilkan y
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
Dua tanggalwaktut
dan u
dapat dikurangi menggunakan t - u
untuk menghitung durasi di antara mereka. Di sini, datetime adalah singkatan dari date
, , datetime
, atau .datetimezone
time
Durasi yang dihasilkan dengan mengurangi u
dari harus menghasilkan t
ketika ditambahkan ke t
u
.
#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
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 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
dany
merupakan nilai terbatas positif.z
adalah hasil darix * 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.
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)
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 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
dany
merupakan nilai terbatas positif.z
adalah hasil darix / 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 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
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)
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 |
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 atauy
disebarluaskan.Tidak ada kesalahan yang disebarluaskan jika item salah satu
x
atauy
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 itemy
.Hasil dari menggabungkan dua tabel adalah tabel yang memiliki gabungan dari dua kolom tabel operand. Urutan
x
kolom dipertahankan, diikuti oleh kolom hanya muncul diy
, mempertahankan pengurutan relatifnya. Untuk kolom yang hanya muncul di salah satu operand,null
digunakan untuk mengisi nilai sel untuk operand lainnya.
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 atauy
disebarluaskan.Jika bidang muncul di dan
x
y
, nilai dariy
digunakan.Urutan bidang dalam rekaman yang dihasilkan adalah dari
x
, diikuti oleh bidang diy
yang bukan bagianx
dari , dalam urutan yang sama seperti yang muncul diy
.Menggabungkan rekaman tidak menyebabkan evaluasi nilai.
Tidak ada kesalahan yang dimunculkan karena bidang berisi kesalahan.
Hasilnya adalah rekaman.
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 atauy
disebarluaskan.Hasilnya adalah tanggalwaktu.
Operator +
, -
, dan not
adalah operator unary.
unary-expression:
type-expression
+
ekspresi unary
-
ekspresi unary
not
ekspresi unary
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 +x
unary plus :
Kesalahan yang dimunculkan saat mengevaluasi
x
disebarluaskan.Jika hasil evaluasi
x
bukan nilai angka, maka kesalahan dengan kode"Expression.Error"
alasan dimunculkan.
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 -x
minus 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 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 x
negasi 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 adalahtrue
, hasilnya adalahfalse
. Jika operand adalahfalse
, hasilnya adalahtrue
.
Hasilnya adalah nilai logis.
Operator is
dan as
dikenal sebagai operator jenis.
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 true
ascribed kompatibel dengan x
, dan mengembalikan y
jika jenis false
ascribed tidak kompatibel dengan x
y
.
y
harus berupa nullable-primitivetype.
is-expression:
as-expression
is-expressionis
nullable-primitive-type
nullable-primitive-type:
nullable
opt 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 jikay
adalah jenisany
, jenisnull
, atau jenis nullable.Jika
x
non-null maka jika kompatibel jika jenisx
primitifnya sama dengany
.
Berikut ini berlaku saat mengevaluasi ekspresi x is y
:
- Kesalahan yang dimunculkan saat mengevaluasi ekspresi
x
disebarluaskan.
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-expressionas
nullable-primitive-type
Ekspresi x as y
dievaluasi sebagai berikut:
Pemeriksaan
x is y
kompatibilitas jenis dilakukan dan pernyataan mengembalikanx
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 ??
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.