aboutsummaryrefslogtreecommitdiff
path: root/doc/yue-id-id.md
diff options
context:
space:
mode:
authorLi Jin <dragon-fly@qq.com>2026-02-24 00:35:05 +0800
committerLi Jin <dragon-fly@qq.com>2026-02-24 00:35:05 +0800
commit50221313c577a2e9f01a3a6b12c8e54594f13126 (patch)
treec2e45b3a7d2392d6cbb5aea9b7de4e2d35b03f69 /doc/yue-id-id.md
parent52974cf6d560c123ecfcb20963e60e6caac87828 (diff)
downloadyuescript-50221313c577a2e9f01a3a6b12c8e54594f13126.tar.gz
yuescript-50221313c577a2e9f01a3a6b12c8e54594f13126.tar.bz2
yuescript-50221313c577a2e9f01a3a6b12c8e54594f13126.zip
Updated all-in-one docs.v0.33.2
Diffstat (limited to 'doc/yue-id-id.md')
-rw-r--r--doc/yue-id-id.md2497
1 files changed, 2 insertions, 2495 deletions
diff --git a/doc/yue-id-id.md b/doc/yue-id-id.md
index ca90d85..200438e 100644
--- a/doc/yue-id-id.md
+++ b/doc/yue-id-id.md
@@ -1,11 +1,5 @@
1---
2title: Referensi
3---
4
5# Dokumentasi YueScript 1# Dokumentasi YueScript
6 2
7<img src="/image/yuescript.svg" width="250px" height="250px" alt="logo" style="padding-top: 3em; padding-bottom: 2em;"/>
8
9Selamat datang di dokumentasi resmi <b>YueScript</b>!<br/> 3Selamat datang di dokumentasi resmi <b>YueScript</b>!<br/>
10Di sini Anda dapat menemukan fitur bahasa, penggunaan, contoh referensi, dan sumber daya.<br/> 4Di sini Anda dapat menemukan fitur bahasa, penggunaan, contoh referensi, dan sumber daya.<br/>
11Silakan pilih bab dari sidebar untuk mulai mempelajari YueScript. 5Silakan pilih bab dari sidebar untuk mulai mempelajari YueScript.
@@ -21,17 +15,6 @@ do
21print var -- nil di sini 15print var -- nil di sini
22``` 16```
23 17
24<YueDisplay>
25
26```yue
27do
28 var = "hello"
29 print var
30print var -- nil di sini
31```
32
33</YueDisplay>
34
35`do` di YueScript juga bisa digunakan sebagai ekspresi, memungkinkan Anda menggabungkan beberapa baris menjadi satu. Hasil ekspresi `do` adalah pernyataan terakhir di badannya. Ekspresi `do` mendukung penggunaan `break` untuk memutus alur eksekusi dan mengembalikan banyak nilai lebih awal. 18`do` di YueScript juga bisa digunakan sebagai ekspresi, memungkinkan Anda menggabungkan beberapa baris menjadi satu. Hasil ekspresi `do` adalah pernyataan terakhir di badannya. Ekspresi `do` mendukung penggunaan `break` untuk memutus alur eksekusi dan mengembalikan banyak nilai lebih awal.
36 19
37```yuescript 20```yuescript
@@ -42,18 +25,6 @@ status, value = do
42 break "small", n 25 break "small", n
43``` 26```
44 27
45<YueDisplay>
46
47```yue
48status, value = do
49 n = 12
50 if n > 10
51 break "large", n
52 break "small", n
53```
54
55</YueDisplay>
56
57```yuescript 28```yuescript
58counter = do 29counter = do
59 i = 0 30 i = 0
@@ -65,21 +36,6 @@ print counter!
65print counter! 36print counter!
66``` 37```
67 38
68<YueDisplay>
69
70```yue
71counter = do
72 i = 0
73 ->
74 i += 1
75 i
76
77print counter!
78print counter!
79```
80
81</YueDisplay>
82
83```yuescript 39```yuescript
84tbl = { 40tbl = {
85 key: do 41 key: do
@@ -88,18 +44,6 @@ tbl = {
88} 44}
89``` 45```
90 46
91<YueDisplay>
92
93```yue
94tbl = {
95 key: do
96 print "assigning key!"
97 1234
98}
99```
100
101</YueDisplay>
102
103# Dekorator Baris 47# Dekorator Baris
104 48
105Untuk kemudahan, loop for dan pernyataan if dapat diterapkan pada pernyataan tunggal di akhir baris: 49Untuk kemudahan, loop for dan pernyataan if dapat diterapkan pada pernyataan tunggal di akhir baris:
@@ -108,28 +52,12 @@ Untuk kemudahan, loop for dan pernyataan if dapat diterapkan pada pernyataan tun
108print "hello world" if name == "Rob" 52print "hello world" if name == "Rob"
109``` 53```
110 54
111<YueDisplay>
112
113```yue
114print "hello world" if name == "Rob"
115```
116
117</YueDisplay>
118
119Dan dengan loop dasar: 55Dan dengan loop dasar:
120 56
121```yuescript 57```yuescript
122print "item: ", item for item in *items 58print "item: ", item for item in *items
123``` 59```
124 60
125<YueDisplay>
126
127```yue
128print "item: ", item for item in *items
129```
130
131</YueDisplay>
132
133Dan dengan loop while: 61Dan dengan loop while:
134 62
135```yuescript 63```yuescript
@@ -138,16 +66,6 @@ game\update! while game\isRunning!
138reader\parse_line! until reader\eof! 66reader\parse_line! until reader\eof!
139``` 67```
140 68
141<YueDisplay>
142
143```yue
144game\update! while game\isRunning!
145
146reader\parse_line! until reader\eof!
147```
148
149</YueDisplay>
150
151# Makro 69# Makro
152 70
153## Penggunaan Umum 71## Penggunaan Umum
@@ -183,39 +101,6 @@ if $and f1!, f2!, f3!
183 print "OK" 101 print "OK"
184``` 102```
185 103
186<YueDisplay>
187
188```yue
189macro PI2 = -> math.pi * 2
190area = $PI2 * 5
191
192macro HELLO = -> "'hello world'"
193print $HELLO
194
195macro config = (debugging) ->
196 global debugMode = debugging == "true"
197 ""
198
199macro asserts = (cond) ->
200 debugMode and "assert #{cond}" or ""
201
202macro assert = (cond) ->
203 debugMode and "assert #{cond}" or "#{cond}"
204
205$config true
206$asserts item ~= nil
207
208$config false
209value = $assert item
210
211-- ekspresi yang dikirim diperlakukan sebagai string
212macro and = (...) -> "#{ table.concat {...}, ' and ' }"
213if $and f1!, f2!, f3!
214 print "OK"
215```
216
217</YueDisplay>
218
219## Menyisipkan Kode Mentah 104## Menyisipkan Kode Mentah
220 105
221Fungsi macro bisa mengembalikan string YueScript atau tabel konfigurasi yang berisi kode Lua. 106Fungsi macro bisa mengembalikan string YueScript atau tabel konfigurasi yang berisi kode Lua.
@@ -246,36 +131,6 @@ end
246]==] 131]==]
247``` 132```
248 133
249<YueDisplay>
250
251```yue
252macro yueFunc = (var) -> "local #{var} = ->"
253$yueFunc funcA
254funcA = -> "gagal meng-assign ke variabel yang didefinisikan oleh macro Yue"
255
256macro luaFunc = (var) -> {
257 code: "local function #{var}() end"
258 type: "lua"
259}
260$luaFunc funcB
261funcB = -> "gagal meng-assign ke variabel yang didefinisikan oleh macro Lua"
262
263macro lua = (code) -> {
264 :code
265 type: "lua"
266}
267
268-- simbol awal dan akhir string mentah otomatis di-trim
269$lua[==[
270-- penyisipan kode Lua mentah
271if cond then
272 print("output")
273end
274]==]
275```
276
277</YueDisplay>
278
279## Export Macro 134## Export Macro
280 135
281Fungsi macro dapat diekspor dari modul dan diimpor di modul lain. Anda harus menaruh fungsi macro export dalam satu file agar dapat digunakan, dan hanya definisi macro, impor macro, dan ekspansi macro yang boleh ada di modul export macro. 136Fungsi macro dapat diekspor dari modul dan diimpor di modul lain. Anda harus menaruh fungsi macro export dalam satu file agar dapat digunakan, dan hanya definisi macro, impor macro, dan ekspansi macro yang boleh ada di modul export macro.
@@ -295,28 +150,6 @@ import "utils" as {
295[1, 2, 3] |> $map(_ * 2) |> $filter(_ > 4) |> $each print _ 150[1, 2, 3] |> $map(_ * 2) |> $filter(_ > 4) |> $each print _
296``` 151```
297 152
298<YueDisplay>
299
300```yue
301-- file: utils.yue
302export macro map = (items, action) -> "[#{action} for _ in *#{items}]"
303export macro filter = (items, action) -> "[_ for _ in *#{items} when #{action}]"
304export macro foreach = (items, action) -> "for _ in *#{items}
305 #{action}"
306
307-- file main.yue
308-- fungsi import tidak tersedia di browser, coba di lingkungan nyata
309--[[
310import "utils" as {
311 $, -- simbol untuk mengimpor semua macro
312 $foreach: $each -- ganti nama macro $foreach menjadi $each
313}
314[1, 2, 3] |> $map(_ * 2) |> $filter(_ > 4) |> $each print _
315]]
316```
317
318</YueDisplay>
319
320## Macro Bawaan 153## Macro Bawaan
321 154
322Ada beberapa macro bawaan tetapi Anda bisa menimpanya dengan mendeklarasikan macro dengan nama yang sama. 155Ada beberapa macro bawaan tetapi Anda bisa menimpanya dengan mendeklarasikan macro dengan nama yang sama.
@@ -326,15 +159,6 @@ print $FILE -- mendapatkan string nama modul saat ini
326print $LINE -- mendapatkan angka 2 159print $LINE -- mendapatkan angka 2
327``` 160```
328 161
329<YueDisplay>
330
331```yue
332print $FILE -- mendapatkan string nama modul saat ini
333print $LINE -- mendapatkan angka 2
334```
335
336</YueDisplay>
337
338## Menghasilkan Macro dengan Macro 162## Menghasilkan Macro dengan Macro
339 163
340Di YueScript, fungsi macro memungkinkan Anda menghasilkan kode pada waktu kompilasi. Dengan menumpuk fungsi macro, Anda dapat membuat pola generasi yang lebih kompleks. Fitur ini memungkinkan Anda mendefinisikan fungsi macro yang menghasilkan fungsi macro lain, sehingga menghasilkan kode yang lebih dinamis. 164Di YueScript, fungsi macro memungkinkan Anda menghasilkan kode pada waktu kompilasi. Dengan menumpuk fungsi macro, Anda dapat membuat pola generasi yang lebih kompleks. Fitur ini memungkinkan Anda mendefinisikan fungsi macro yang menghasilkan fungsi macro lain, sehingga menghasilkan kode yang lebih dinamis.
@@ -357,28 +181,6 @@ print "Valid enum type:", $BodyType Static
357-- print "Compilation error with enum type:", $BodyType Unknown 181-- print "Compilation error with enum type:", $BodyType Unknown
358``` 182```
359 183
360<YueDisplay>
361
362```yue
363macro Enum = (...) ->
364 items = {...}
365 itemSet = {item, true for item in *items}
366 (item) ->
367 error "got \"#{item}\", expecting one of #{table.concat items, ', '}" unless itemSet[item]
368 "\"#{item}\""
369
370macro BodyType = $Enum(
371 Static
372 Dynamic
373 Kinematic
374)
375
376print "Valid enum type:", $BodyType Static
377-- print "Compilation error with enum type:", $BodyType Unknown
378```
379
380</YueDisplay>
381
382## Validasi Argumen 184## Validasi Argumen
383 185
384Anda dapat mendeklarasikan tipe node AST yang diharapkan dalam daftar argumen, dan memeriksa apakah argumen macro yang masuk memenuhi harapan pada waktu kompilasi. 186Anda dapat mendeklarasikan tipe node AST yang diharapkan dalam daftar argumen, dan memeriksa apakah argumen macro yang masuk memenuhi harapan pada waktu kompilasi.
@@ -393,20 +195,6 @@ macro printNumAndStr = (num `Num, str `String) -> |
393$printNumAndStr 123, "hello" 195$printNumAndStr 123, "hello"
394``` 196```
395 197
396<YueDisplay>
397
398```yue
399macro printNumAndStr = (num `Num, str `String) -> |
400 print(
401 #{num}
402 #{str}
403 )
404
405$printNumAndStr 123, "hello"
406```
407
408</YueDisplay>
409
410Jika Anda membutuhkan pengecekan argumen yang lebih fleksibel, Anda dapat menggunakan fungsi macro bawaan `$is_ast` untuk memeriksa secara manual pada tempat yang tepat. 198Jika Anda membutuhkan pengecekan argumen yang lebih fleksibel, Anda dapat menggunakan fungsi macro bawaan `$is_ast` untuk memeriksa secara manual pada tempat yang tepat.
411 199
412```yuescript 200```yuescript
@@ -418,19 +206,6 @@ macro printNumAndStr = (num, str) ->
418$printNumAndStr 123, "hello" 206$printNumAndStr 123, "hello"
419``` 207```
420 208
421<YueDisplay>
422
423```yue
424macro printNumAndStr = (num, str) ->
425 error "expected Num as first argument" unless $is_ast Num, num
426 error "expected String as second argument" unless $is_ast String, str
427 "print(#{num}, #{str})"
428
429$printNumAndStr 123, "hello"
430```
431
432</YueDisplay>
433
434Untuk detail lebih lanjut tentang node AST yang tersedia, silakan lihat definisi huruf besar di [yue_parser.cpp](https://github.com/IppClub/YueScript/blob/main/src/yuescript/yue_parser.cpp). 209Untuk detail lebih lanjut tentang node AST yang tersedia, silakan lihat definisi huruf besar di [yue_parser.cpp](https://github.com/IppClub/YueScript/blob/main/src/yuescript/yue_parser.cpp).
435 210
436# Try 211# Try
@@ -465,38 +240,6 @@ catch err
465 print result 240 print result
466``` 241```
467 242
468<YueDisplay>
469
470```yue
471try
472 func 1, 2, 3
473catch err
474 print yue.traceback err
475
476success, result = try
477 func 1, 2, 3
478catch err
479 yue.traceback err
480
481try func 1, 2, 3
482catch err
483 print yue.traceback err
484
485success, result = try func 1, 2, 3
486
487try
488 print "trying"
489 func 1, 2, 3
490
491-- bekerja dengan pola if assignment
492if success, result := try func 1, 2, 3
493catch err
494 print yue.traceback err
495 print result
496```
497
498</YueDisplay>
499
500## Try? 243## Try?
501 244
502`try?` adalah bentuk sederhana untuk penanganan error yang menghilangkan status boolean dari pernyataan `try`, dan akan mengembalikan hasil dari blok try ketika berhasil, atau mengembalikan nil alih-alih objek error bila gagal. 245`try?` adalah bentuk sederhana untuk penanganan error yang menghilangkan status boolean dari pernyataan `try`, dan akan mengembalikan hasil dari blok try ketika berhasil, atau mengembalikan nil alih-alih objek error bila gagal.
@@ -519,44 +262,14 @@ catch e
519 e 262 e
520``` 263```
521 264
522<YueDisplay>
523
524```yue
525a, b, c = try? func!
526
527-- dengan operator nil coalescing
528a = (try? func!) ?? "default"
529
530-- sebagai argumen fungsi
531f try? func!
532
533-- dengan blok catch
534f try?
535 print 123
536 func!
537catch e
538 print e
539 e
540```
541
542</YueDisplay>
543
544# Literal Tabel 265# Literal Tabel
545 266
546Seperti di Lua, tabel dibatasi dengan kurung kurawal. 267Seperti di Lua, tabel dibatasi dengan kurung kurawal.
547 268
548```yuescript 269```yuescript
549some_values = [1, 2, 3, 4] 270some_values = {1, 2, 3, 4}
550```
551
552<YueDisplay>
553
554```yue
555some_values = [1, 2, 3, 4]
556``` 271```
557 272
558</YueDisplay>
559
560Berbeda dengan Lua, assignment nilai ke sebuah kunci di tabel dilakukan dengan **:** (bukan **=**). 273Berbeda dengan Lua, assignment nilai ke sebuah kunci di tabel dilakukan dengan **:** (bukan **=**).
561 274
562```yuescript 275```yuescript
@@ -567,18 +280,6 @@ some_values = {
567} 280}
568``` 281```
569 282
570<YueDisplay>
571
572```yue
573some_values = {
574 name: "Bill",
575 age: 200,
576 ["favorite food"]: "rice"
577}
578```
579
580</YueDisplay>
581
582Kurung kurawal dapat dihilangkan jika hanya satu tabel pasangan key-value yang di-assign. 283Kurung kurawal dapat dihilangkan jika hanya satu tabel pasangan key-value yang di-assign.
583 284
584```yuescript 285```yuescript
@@ -588,17 +289,6 @@ profile =
588 favorite_foods: ["ice cream", "donuts"] 289 favorite_foods: ["ice cream", "donuts"]
589``` 290```
590 291
591<YueDisplay>
592
593```yue
594profile =
595 height: "4 feet",
596 shoe_size: 13,
597 favorite_foods: ["ice cream", "donuts"]
598```
599
600</YueDisplay>
601
602Baris baru dapat digunakan untuk memisahkan nilai sebagai ganti koma (atau keduanya): 292Baris baru dapat digunakan untuk memisahkan nilai sebagai ganti koma (atau keduanya):
603 293
604```yuescript 294```yuescript
@@ -610,19 +300,6 @@ values = {
610} 300}
611``` 301```
612 302
613<YueDisplay>
614
615```yue
616values = {
617 1, 2, 3, 4
618 5, 6, 7, 8
619 name: "superman"
620 occupation: "crime fighting"
621}
622```
623
624</YueDisplay>
625
626Saat membuat literal tabel satu baris, kurung kurawal juga bisa dihilangkan: 303Saat membuat literal tabel satu baris, kurung kurawal juga bisa dihilangkan:
627 304
628```yuescript 305```yuescript
@@ -631,16 +308,6 @@ my_function dance: "Tango", partner: "none"
631y = type: "dog", legs: 4, tails: 1 308y = type: "dog", legs: 4, tails: 1
632``` 309```
633 310
634<YueDisplay>
635
636```yue
637my_function dance: "Tango", partner: "none"
638
639y = type: "dog", legs: 4, tails: 1
640```
641
642</YueDisplay>
643
644Kunci literal tabel dapat berupa kata kunci bahasa tanpa perlu di-escape: 311Kunci literal tabel dapat berupa kata kunci bahasa tanpa perlu di-escape:
645 312
646```yuescript 313```yuescript
@@ -650,17 +317,6 @@ tbl = {
650} 317}
651``` 318```
652 319
653<YueDisplay>
654
655```yue
656tbl = {
657 do: "something"
658 end: "hunger"
659}
660```
661
662</YueDisplay>
663
664Jika Anda membangun tabel dari variabel dan ingin kunci sama dengan nama variabel, maka operator prefiks **:** dapat digunakan: 320Jika Anda membangun tabel dari variabel dan ingin kunci sama dengan nama variabel, maka operator prefiks **:** dapat digunakan:
665 321
666```yuescript 322```yuescript
@@ -671,18 +327,6 @@ person = { :hair, :height, shoe_size: 40 }
671print_table :hair, :height 327print_table :hair, :height
672``` 328```
673 329
674<YueDisplay>
675
676```yue
677hair = "golden"
678height = 200
679person = { :hair, :height, shoe_size: 40 }
680
681print_table :hair, :height
682```
683
684</YueDisplay>
685
686Jika Anda ingin kunci field dalam tabel menjadi hasil suatu ekspresi, Anda dapat membungkusnya dengan **[ ]**, seperti di Lua. Anda juga bisa menggunakan literal string langsung sebagai kunci tanpa tanda kurung siku. Ini berguna jika kunci memiliki karakter khusus. 330Jika Anda ingin kunci field dalam tabel menjadi hasil suatu ekspresi, Anda dapat membungkusnya dengan **[ ]**, seperti di Lua. Anda juga bisa menggunakan literal string langsung sebagai kunci tanpa tanda kurung siku. Ini berguna jika kunci memiliki karakter khusus.
687 331
688```yuescript 332```yuescript
@@ -692,33 +336,13 @@ t = {
692} 336}
693``` 337```
694 338
695<YueDisplay> 339Tabel Lua memiliki bagian array dan bagian hash, tetapi kadang-kadang berguna untuk membuat perbedaan semantik di antara keduanya. Anda dapat menggunakan **[ ]** sebagai ganti **{ }** untuk mendeklarasikan tabel secara eksplisit sebagai array, dengan begitu akan mencegah pasangan key-value dituliskan di dalamnya.
696
697```yue
698t = {
699 [1 + 2]: "hello"
700 "hello world": true
701}
702```
703
704</YueDisplay>
705
706Tabel Lua memiliki bagian array dan bagian hash, tetapi terkadang Anda ingin membedakan penggunaan array dan hash secara semantik saat menulis tabel Lua. Maka Anda bisa menulis tabel Lua dengan **[ ]** alih-alih **{ }** untuk merepresentasikan tabel array, dan menuliskan pasangan key-value di tabel list tidak akan diizinkan.
707 340
708```yuescript 341```yuescript
709some_values = [1, 2, 3, 4] 342some_values = [1, 2, 3, 4]
710list_with_one_element = [1, ] 343list_with_one_element = [1, ]
711``` 344```
712 345
713<YueDisplay>
714
715```yue
716some_values = [1, 2, 3, 4]
717list_with_one_element = [1, ]
718```
719
720</YueDisplay>
721
722# Komprehensi 346# Komprehensi
723 347
724Komprehensi menyediakan sintaks yang nyaman untuk membangun tabel baru dengan mengiterasi objek yang ada dan menerapkan ekspresi pada nilainya. Ada dua jenis komprehensi: komprehensi list dan komprehensi tabel. Keduanya menghasilkan tabel Lua; komprehensi list mengakumulasi nilai ke tabel mirip array, dan komprehensi tabel memungkinkan Anda menetapkan kunci dan nilai pada setiap iterasi. 348Komprehensi menyediakan sintaks yang nyaman untuk membangun tabel baru dengan mengiterasi objek yang ada dan menerapkan ekspresi pada nilainya. Ada dua jenis komprehensi: komprehensi list dan komprehensi tabel. Keduanya menghasilkan tabel Lua; komprehensi list mengakumulasi nilai ke tabel mirip array, dan komprehensi tabel memungkinkan Anda menetapkan kunci dan nilai pada setiap iterasi.
@@ -732,43 +356,18 @@ items = [ 1, 2, 3, 4 ]
732doubled = [item * 2 for i, item in ipairs items] 356doubled = [item * 2 for i, item in ipairs items]
733``` 357```
734 358
735<YueDisplay>
736
737```yue
738items = [ 1, 2, 3, 4 ]
739doubled = [item * 2 for i, item in ipairs items]
740```
741
742</YueDisplay>
743
744Item yang disertakan dalam tabel baru bisa dibatasi dengan klausa `when`: 359Item yang disertakan dalam tabel baru bisa dibatasi dengan klausa `when`:
745 360
746```yuescript 361```yuescript
747slice = [item for i, item in ipairs items when i > 1 and i < 3] 362slice = [item for i, item in ipairs items when i > 1 and i < 3]
748``` 363```
749 364
750<YueDisplay>
751
752```yue
753slice = [item for i, item in ipairs items when i > 1 and i < 3]
754```
755
756</YueDisplay>
757
758Karena umum untuk mengiterasi nilai dari tabel berindeks numerik, operator **\*** diperkenalkan. Contoh `doubled` bisa ditulis ulang sebagai: 365Karena umum untuk mengiterasi nilai dari tabel berindeks numerik, operator **\*** diperkenalkan. Contoh `doubled` bisa ditulis ulang sebagai:
759 366
760```yuescript 367```yuescript
761doubled = [item * 2 for item in *items] 368doubled = [item * 2 for item in *items]
762``` 369```
763 370
764<YueDisplay>
765
766```yue
767doubled = [item * 2 for item in *items]
768```
769
770</YueDisplay>
771
772Dalam komprehensi list, Anda juga bisa menggunakan operator spread `...` untuk meratakan list bertingkat, menghasilkan efek flat map: 371Dalam komprehensi list, Anda juga bisa menggunakan operator spread `...` untuk meratakan list bertingkat, menghasilkan efek flat map:
773 372
774```yuescript 373```yuescript
@@ -780,19 +379,6 @@ flat = [...v for k,v in pairs data]
780-- flat sekarang [1, 2, 3, 4, 5, 6] 379-- flat sekarang [1, 2, 3, 4, 5, 6]
781``` 380```
782 381
783<YueDisplay>
784
785```yue
786data =
787 a: [1, 2, 3]
788 b: [4, 5, 6]
789
790flat = [...v for k,v in pairs data]
791-- flat sekarang [1, 2, 3, 4, 5, 6]
792```
793
794</YueDisplay>
795
796Klausa `for` dan `when` dapat dirantai sebanyak yang diinginkan. Satu-satunya syarat adalah komprehensi memiliki setidaknya satu klausa `for`. 382Klausa `for` dan `when` dapat dirantai sebanyak yang diinginkan. Satu-satunya syarat adalah komprehensi memiliki setidaknya satu klausa `for`.
797 383
798Menggunakan beberapa klausa `for` sama seperti menggunakan loop bertingkat: 384Menggunakan beberapa klausa `for` sama seperti menggunakan loop bertingkat:
@@ -805,32 +391,12 @@ points = [ [x, y] for x in *x_coords \
805for y in *y_coords] 391for y in *y_coords]
806``` 392```
807 393
808<YueDisplay>
809
810```yue
811x_coords = [4, 5, 6, 7]
812y_coords = [9, 2, 3]
813
814points = [ [x, y] for x in *x_coords \
815for y in *y_coords]
816```
817
818</YueDisplay>
819
820Perulangan for numerik juga bisa digunakan dalam komprehensi: 394Perulangan for numerik juga bisa digunakan dalam komprehensi:
821 395
822```yuescript 396```yuescript
823evens = [i for i = 1, 100 when i % 2 == 0] 397evens = [i for i = 1, 100 when i % 2 == 0]
824``` 398```
825 399
826<YueDisplay>
827
828```yue
829evens = [i for i = 1, 100 when i % 2 == 0]
830```
831
832</YueDisplay>
833
834## Komprehensi Tabel 400## Komprehensi Tabel
835 401
836Sintaks untuk komprehensi tabel sangat mirip, hanya berbeda dengan penggunaan **{** dan **}** serta mengambil dua nilai dari setiap iterasi. 402Sintaks untuk komprehensi tabel sangat mirip, hanya berbeda dengan penggunaan **{** dan **}** serta mengambil dua nilai dari setiap iterasi.
@@ -847,32 +413,10 @@ thing = {
847thing_copy = {k, v for k, v in pairs thing} 413thing_copy = {k, v for k, v in pairs thing}
848``` 414```
849 415
850<YueDisplay>
851
852```yue
853thing = {
854 color: "red"
855 name: "fast"
856 width: 123
857}
858
859thing_copy = {k, v for k, v in pairs thing}
860```
861
862</YueDisplay>
863
864```yuescript 416```yuescript
865no_color = {k, v for k, v in pairs thing when k != "color"} 417no_color = {k, v for k, v in pairs thing when k != "color"}
866``` 418```
867 419
868<YueDisplay>
869
870```yue
871no_color = {k, v for k, v in pairs thing when k != "color"}
872```
873
874</YueDisplay>
875
876Operator **\*** juga didukung. Di sini kita membuat tabel lookup akar kuadrat untuk beberapa angka. 420Operator **\*** juga didukung. Di sini kita membuat tabel lookup akar kuadrat untuk beberapa angka.
877 421
878```yuescript 422```yuescript
@@ -880,15 +424,6 @@ numbers = [1, 2, 3, 4]
880sqrts = {i, math.sqrt i for i in *numbers} 424sqrts = {i, math.sqrt i for i in *numbers}
881``` 425```
882 426
883<YueDisplay>
884
885```yue
886numbers = [1, 2, 3, 4]
887sqrts = {i, math.sqrt i for i in *numbers}
888```
889
890</YueDisplay>
891
892Tuple key-value dalam komprehensi tabel juga bisa berasal dari satu ekspresi, yang berarti ekspresi tersebut harus mengembalikan dua nilai. Nilai pertama digunakan sebagai kunci dan nilai kedua digunakan sebagai nilai: 427Tuple key-value dalam komprehensi tabel juga bisa berasal dari satu ekspresi, yang berarti ekspresi tersebut harus mengembalikan dua nilai. Nilai pertama digunakan sebagai kunci dan nilai kedua digunakan sebagai nilai:
893 428
894Dalam contoh ini kita mengonversi array pasangan menjadi tabel di mana item pertama dalam pasangan menjadi kunci dan item kedua menjadi nilai. 429Dalam contoh ini kita mengonversi array pasangan menjadi tabel di mana item pertama dalam pasangan menjadi kunci dan item kedua menjadi nilai.
@@ -898,15 +433,6 @@ tuples = [ ["hello", "world"], ["foo", "bar"]]
898tbl = {unpack tuple for tuple in *tuples} 433tbl = {unpack tuple for tuple in *tuples}
899``` 434```
900 435
901<YueDisplay>
902
903```yue
904tuples = [ ["hello", "world"], ["foo", "bar"]]
905tbl = {unpack tuple for tuple in *tuples}
906```
907
908</YueDisplay>
909
910## Slicing 436## Slicing
911 437
912Sintaks khusus disediakan untuk membatasi item yang diiterasi saat menggunakan operator **\***. Ini setara dengan mengatur batas iterasi dan ukuran langkah pada loop for. 438Sintaks khusus disediakan untuk membatasi item yang diiterasi saat menggunakan operator **\***. Ini setara dengan mengatur batas iterasi dan ukuran langkah pada loop for.
@@ -917,42 +443,18 @@ Di sini kita bisa menetapkan batas minimum dan maksimum, mengambil semua item de
917slice = [item for item in *items[1, 5]] 443slice = [item for item in *items[1, 5]]
918``` 444```
919 445
920<YueDisplay>
921
922```yue
923slice = [item for item in *items[1, 5]]
924```
925
926</YueDisplay>
927
928Salah satu argumen slice boleh dikosongkan untuk menggunakan default yang masuk akal. Pada contoh ini, jika indeks maksimum dikosongkan, defaultnya adalah panjang tabel. Ini akan mengambil semua item kecuali elemen pertama: 446Salah satu argumen slice boleh dikosongkan untuk menggunakan default yang masuk akal. Pada contoh ini, jika indeks maksimum dikosongkan, defaultnya adalah panjang tabel. Ini akan mengambil semua item kecuali elemen pertama:
929 447
930```yuescript 448```yuescript
931slice = [item for item in *items[2,]] 449slice = [item for item in *items[2,]]
932``` 450```
933 451
934<YueDisplay>
935
936```yue
937slice = [item for item in *items[2,]]
938```
939
940</YueDisplay>
941
942Jika batas minimum dikosongkan, defaultnya adalah 1. Di sini kita hanya memberikan ukuran langkah dan membiarkan batas lainnya kosong. Ini akan mengambil semua item berindeks ganjil: (1, 3, 5, …) 452Jika batas minimum dikosongkan, defaultnya adalah 1. Di sini kita hanya memberikan ukuran langkah dan membiarkan batas lainnya kosong. Ini akan mengambil semua item berindeks ganjil: (1, 3, 5, …)
943 453
944```yuescript 454```yuescript
945slice = [item for item in *items[,,2]] 455slice = [item for item in *items[,,2]]
946``` 456```
947 457
948<YueDisplay>
949
950```yue
951slice = [item for item in *items[,,2]]
952```
953
954</YueDisplay>
955
956Batas minimum dan maksimum bisa bernilai negatif, yang berarti batas dihitung dari akhir tabel. 458Batas minimum dan maksimum bisa bernilai negatif, yang berarti batas dihitung dari akhir tabel.
957 459
958```yuescript 460```yuescript
@@ -960,29 +462,12 @@ Batas minimum dan maksimum bisa bernilai negatif, yang berarti batas dihitung da
960slice = [item for item in *items[-4,-1]] 462slice = [item for item in *items[-4,-1]]
961``` 463```
962 464
963<YueDisplay>
964
965```yue
966-- ambil 4 item terakhir
967slice = [item for item in *items[-4,-1]]
968```
969
970</YueDisplay>
971
972Ukuran langkah juga bisa negatif, yang berarti item diambil dalam urutan terbalik. 465Ukuran langkah juga bisa negatif, yang berarti item diambil dalam urutan terbalik.
973 466
974```yuescript 467```yuescript
975reverse_slice = [item for item in *items[-1,1,-1]] 468reverse_slice = [item for item in *items[-1,1,-1]]
976``` 469```
977 470
978<YueDisplay>
979
980```yue
981reverse_slice = [item for item in *items[-1,1,-1]]
982```
983
984</YueDisplay>
985
986### Ekspresi Slicing 471### Ekspresi Slicing
987 472
988Slicing juga bisa digunakan sebagai ekspresi. Ini berguna untuk mendapatkan sub-list dari sebuah tabel. 473Slicing juga bisa digunakan sebagai ekspresi. Ini berguna untuk mendapatkan sub-list dari sebuah tabel.
@@ -995,18 +480,6 @@ sub_list = items[2, 4]
995last_four_items = items[-4, -1] 480last_four_items = items[-4, -1]
996``` 481```
997 482
998<YueDisplay>
999
1000```yue
1001-- ambil item ke-2 dan ke-4 sebagai list baru
1002sub_list = items[2, 4]
1003
1004-- ambil 4 item terakhir
1005last_four_items = items[-4, -1]
1006```
1007
1008</YueDisplay>
1009
1010# Pemrograman Berorientasi Objek 483# Pemrograman Berorientasi Objek
1011 484
1012Dalam contoh-contoh ini, kode Lua yang dihasilkan mungkin tampak berat. Sebaiknya fokus dulu pada makna kode YueScript, lalu lihat kode Lua jika Anda ingin mengetahui detail implementasinya. 485Dalam contoh-contoh ini, kode Lua yang dihasilkan mungkin tampak berat. Sebaiknya fokus dulu pada makna kode YueScript, lalu lihat kode Lua jika Anda ingin mengetahui detail implementasinya.
@@ -1025,22 +498,6 @@ class Inventory
1025 @items[name] = 1 498 @items[name] = 1
1026``` 499```
1027 500
1028<YueDisplay>
1029
1030```yue
1031class Inventory
1032 new: =>
1033 @items = {}
1034
1035 add_item: (name) =>
1036 if @items[name]
1037 @items[name] += 1
1038 else
1039 @items[name] = 1
1040```
1041
1042</YueDisplay>
1043
1044Kelas dideklarasikan dengan pernyataan `class` diikuti deklarasi mirip tabel di mana semua method dan properti dicantumkan. 501Kelas dideklarasikan dengan pernyataan `class` diikuti deklarasi mirip tabel di mana semua method dan properti dicantumkan.
1045 502
1046Properti `new` bersifat khusus karena akan menjadi konstruktor. 503Properti `new` bersifat khusus karena akan menjadi konstruktor.
@@ -1057,16 +514,6 @@ inv\add_item "t-shirt"
1057inv\add_item "pants" 514inv\add_item "pants"
1058``` 515```
1059 516
1060<YueDisplay>
1061
1062```yue
1063inv = Inventory!
1064inv\add_item "t-shirt"
1065inv\add_item "pants"
1066```
1067
1068</YueDisplay>
1069
1070Karena instance kelas perlu dikirim ke method saat dipanggil, operator `\` digunakan. 517Karena instance kelas perlu dikirim ke method saat dipanggil, operator `\` digunakan.
1071 518
1072Semua properti kelas dibagikan di antara instance. Ini baik untuk fungsi, tetapi untuk jenis objek lain dapat menimbulkan hasil yang tidak diinginkan. 519Semua properti kelas dibagikan di antara instance. Ini baik untuk fungsi, tetapi untuk jenis objek lain dapat menimbulkan hasil yang tidak diinginkan.
@@ -1089,26 +536,6 @@ b\give_item "shirt"
1089print item for item in *a.clothes 536print item for item in *a.clothes
1090``` 537```
1091 538
1092<YueDisplay>
1093
1094```yue
1095class Person
1096 clothes: []
1097 give_item: (name) =>
1098 table.insert @clothes, name
1099
1100a = Person!
1101b = Person!
1102
1103a\give_item "pants"
1104b\give_item "shirt"
1105
1106-- akan mencetak pants dan shirt
1107print item for item in *a.clothes
1108```
1109
1110</YueDisplay>
1111
1112Cara yang benar untuk menghindari masalah ini adalah membuat state yang dapat berubah di konstruktor: 539Cara yang benar untuk menghindari masalah ini adalah membuat state yang dapat berubah di konstruktor:
1113 540
1114```yuescript 541```yuescript
@@ -1117,16 +544,6 @@ class Person
1117 @clothes = [] 544 @clothes = []
1118``` 545```
1119 546
1120<YueDisplay>
1121
1122```yue
1123class Person
1124 new: =>
1125 @clothes = []
1126```
1127
1128</YueDisplay>
1129
1130## Pewarisan 547## Pewarisan
1131 548
1132Kata kunci `extends` dapat digunakan dalam deklarasi kelas untuk mewarisi properti dan method dari kelas lain. 549Kata kunci `extends` dapat digunakan dalam deklarasi kelas untuk mewarisi properti dan method dari kelas lain.
@@ -1139,18 +556,6 @@ class BackPack extends Inventory
1139 super name 556 super name
1140``` 557```
1141 558
1142<YueDisplay>
1143
1144```yue
1145class BackPack extends Inventory
1146 size: 10
1147 add_item: (name) =>
1148 if #@items > size then error "backpack is full"
1149 super name
1150```
1151
1152</YueDisplay>
1153
1154Di sini kita memperluas kelas Inventory, dan membatasi jumlah item yang bisa dibawa. 559Di sini kita memperluas kelas Inventory, dan membatasi jumlah item yang bisa dibawa.
1155 560
1156Dalam contoh ini, kita tidak mendefinisikan konstruktor pada subclass, sehingga konstruktor kelas induk dipanggil ketika membuat instance baru. Jika kita mendefinisikan konstruktor, kita bisa menggunakan method `super` untuk memanggil konstruktor induk. 561Dalam contoh ini, kita tidak mendefinisikan konstruktor pada subclass, sehingga konstruktor kelas induk dipanggil ketika membuat instance baru. Jika kita mendefinisikan konstruktor, kita bisa menggunakan method `super` untuk memanggil konstruktor induk.
@@ -1166,19 +571,6 @@ class Shelf
1166class Cupboard extends Shelf 571class Cupboard extends Shelf
1167``` 572```
1168 573
1169<YueDisplay>
1170
1171```yue
1172class Shelf
1173 @__inherited: (child) =>
1174 print @__name, "was inherited by", child.__name
1175
1176-- akan mencetak: Shelf was inherited by Cupboard
1177class Cupboard extends Shelf
1178```
1179
1180</YueDisplay>
1181
1182## Super 574## Super
1183 575
1184**super** adalah kata kunci khusus yang dapat digunakan dengan dua cara: sebagai objek, atau dipanggil seperti fungsi. Ia hanya memiliki fungsi khusus ketika berada di dalam kelas. 576**super** adalah kata kunci khusus yang dapat digunakan dengan dua cara: sebagai objek, atau dipanggil seperti fungsi. Ia hanya memiliki fungsi khusus ketika berada di dalam kelas.
@@ -1205,22 +597,6 @@ class MyClass extends ParentClass
1205 assert super == ParentClass 597 assert super == ParentClass
1206``` 598```
1207 599
1208<YueDisplay>
1209
1210```yue
1211class MyClass extends ParentClass
1212 a_method: =>
1213 -- berikut memiliki efek yang sama:
1214 super "hello", "world"
1215 super\a_method "hello", "world"
1216 super.a_method self, "hello", "world"
1217
1218 -- super sebagai nilai sama dengan kelas induk:
1219 assert super == ParentClass
1220```
1221
1222</YueDisplay>
1223
1224**super** juga dapat digunakan di sisi kiri Function Stub. Perbedaan utamanya adalah, alih-alih fungsi hasil terikat pada nilai `super`, fungsi terikat pada `self`. 600**super** juga dapat digunakan di sisi kiri Function Stub. Perbedaan utamanya adalah, alih-alih fungsi hasil terikat pada nilai `super`, fungsi terikat pada `self`.
1225 601
1226## Tipe 602## Tipe
@@ -1234,17 +610,6 @@ assert b.__class == BackPack
1234print BackPack.size -- mencetak 10 610print BackPack.size -- mencetak 10
1235``` 611```
1236 612
1237<YueDisplay>
1238
1239```yue
1240b = BackPack!
1241assert b.__class == BackPack
1242
1243print BackPack.size -- mencetak 10
1244```
1245
1246</YueDisplay>
1247
1248## Objek Kelas 613## Objek Kelas
1249 614
1250Objek kelas adalah yang kita buat saat menggunakan pernyataan `class`. Objek kelas disimpan dalam variabel dengan nama yang sama dengan kelas. 615Objek kelas adalah yang kita buat saat menggunakan pernyataan `class`. Objek kelas disimpan dalam variabel dengan nama yang sama dengan kelas.
@@ -1265,14 +630,6 @@ Nama kelas saat dideklarasikan disimpan sebagai string di field `__name` pada ob
1265print BackPack.__name -- mencetak Backpack 630print BackPack.__name -- mencetak Backpack
1266``` 631```
1267 632
1268<YueDisplay>
1269
1270```yue
1271print BackPack.__name -- mencetak Backpack
1272```
1273
1274</YueDisplay>
1275
1276Objek base disimpan di `__base`. Kita dapat memodifikasi tabel ini untuk menambahkan fungsionalitas ke instance yang sudah dibuat maupun yang akan dibuat. 633Objek base disimpan di `__base`. Kita dapat memodifikasi tabel ini untuk menambahkan fungsionalitas ke instance yang sudah dibuat maupun yang akan dibuat.
1277 634
1278Jika kelas memperluas kelas lain, objek kelas induk disimpan di `__parent`. 635Jika kelas memperluas kelas lain, objek kelas induk disimpan di `__parent`.
@@ -1291,20 +648,6 @@ Things\some_func!
1291assert Things().some_func == nil 648assert Things().some_func == nil
1292``` 649```
1293 650
1294<YueDisplay>
1295
1296```yue
1297class Things
1298 @some_func: => print "Hello from", @__name
1299
1300Things\some_func!
1301
1302-- variabel kelas tidak terlihat pada instance
1303assert Things().some_func == nil
1304```
1305
1306</YueDisplay>
1307
1308Dalam ekspresi, kita dapat menggunakan `@@` untuk mengakses nilai yang disimpan di `__class` milik `self`. Jadi, `@@hello` adalah singkatan dari `self.__class.hello`. 651Dalam ekspresi, kita dapat menggunakan `@@` untuk mengakses nilai yang disimpan di `__class` milik `self`. Jadi, `@@hello` adalah singkatan dari `self.__class.hello`.
1309 652
1310```yuescript 653```yuescript
@@ -1320,37 +663,12 @@ Counter!
1320print Counter.count -- mencetak 2 663print Counter.count -- mencetak 2
1321``` 664```
1322 665
1323<YueDisplay>
1324
1325```yue
1326class Counter
1327 @count: 0
1328
1329 new: =>
1330 @@count += 1
1331
1332Counter!
1333Counter!
1334
1335print Counter.count -- mencetak 2
1336```
1337
1338</YueDisplay>
1339
1340Semantik pemanggilan `@@` mirip dengan `@`. Memanggil nama `@@` akan meneruskan kelas sebagai argumen pertama menggunakan sintaks kolon Lua. 666Semantik pemanggilan `@@` mirip dengan `@`. Memanggil nama `@@` akan meneruskan kelas sebagai argumen pertama menggunakan sintaks kolon Lua.
1341 667
1342```yuescript 668```yuescript
1343@@hello 1,2,3,4 669@@hello 1,2,3,4
1344``` 670```
1345 671
1346<YueDisplay>
1347
1348```yue
1349@@hello 1,2,3,4
1350```
1351
1352</YueDisplay>
1353
1354## Pernyataan Deklarasi Kelas 672## Pernyataan Deklarasi Kelas
1355 673
1356Di dalam badan deklarasi kelas, kita bisa memiliki ekspresi normal selain pasangan key/value. Dalam konteks ini, `self` sama dengan objek kelas. 674Di dalam badan deklarasi kelas, kita bisa memiliki ekspresi normal selain pasangan key/value. Dalam konteks ini, `self` sama dengan objek kelas.
@@ -1362,15 +680,6 @@ class Things
1362 @class_var = "hello world" 680 @class_var = "hello world"
1363``` 681```
1364 682
1365<YueDisplay>
1366
1367```yue
1368class Things
1369 @class_var = "hello world"
1370```
1371
1372</YueDisplay>
1373
1374Ekspresi ini dieksekusi setelah semua properti ditambahkan ke base. 683Ekspresi ini dieksekusi setelah semua properti ditambahkan ke base.
1375 684
1376Semua variabel yang dideklarasikan di badan kelas bersifat lokal terhadap properti kelas. Ini berguna untuk menempatkan nilai privat atau fungsi pembantu yang hanya dapat diakses oleh method kelas: 685Semua variabel yang dideklarasikan di badan kelas bersifat lokal terhadap properti kelas. Ini berguna untuk menempatkan nilai privat atau fungsi pembantu yang hanya dapat diakses oleh method kelas:
@@ -1384,19 +693,6 @@ class MoreThings
1384 log "hello world: " .. secret 693 log "hello world: " .. secret
1385``` 694```
1386 695
1387<YueDisplay>
1388
1389```yue
1390class MoreThings
1391 secret = 123
1392 log = (msg) -> print "LOG:", msg
1393
1394 some_method: =>
1395 log "hello world: " .. secret
1396```
1397
1398</YueDisplay>
1399
1400## Nilai @ dan @@ 696## Nilai @ dan @@
1401 697
1402Ketika `@` dan `@@` diprefiks di depan sebuah nama, masing-masing merepresentasikan nama tersebut yang diakses di `self` dan `self.__class`. 698Ketika `@` dan `@@` diprefiks di depan sebuah nama, masing-masing merepresentasikan nama tersebut yang diakses di `self` dan `self.__class`.
@@ -1408,29 +704,12 @@ assert @ == self
1408assert @@ == self.__class 704assert @@ == self.__class
1409``` 705```
1410 706
1411<YueDisplay>
1412
1413```yue
1414assert @ == self
1415assert @@ == self.__class
1416```
1417
1418</YueDisplay>
1419
1420Contohnya, cara cepat untuk membuat instance baru dari kelas yang sama dari method instance menggunakan `@@`: 707Contohnya, cara cepat untuk membuat instance baru dari kelas yang sama dari method instance menggunakan `@@`:
1421 708
1422```yuescript 709```yuescript
1423some_instance_method = (...) => @@ ... 710some_instance_method = (...) => @@ ...
1424``` 711```
1425 712
1426<YueDisplay>
1427
1428```yue
1429some_instance_method = (...) => @@ ...
1430```
1431
1432</YueDisplay>
1433
1434## Promosi Properti Konstruktor 713## Promosi Properti Konstruktor
1435 714
1436Untuk mengurangi boilerplate saat mendefinisikan objek nilai sederhana, Anda dapat menulis kelas sederhana seperti: 715Untuk mengurangi boilerplate saat mendefinisikan objek nilai sederhana, Anda dapat menulis kelas sederhana seperti:
@@ -1449,24 +728,6 @@ class Something
1449 @@baz = baz 728 @@baz = baz
1450``` 729```
1451 730
1452<YueDisplay>
1453
1454```yue
1455class Something
1456 new: (@foo, @bar, @@biz, @@baz) =>
1457
1458-- Yang merupakan singkatan dari
1459
1460class Something
1461 new: (foo, bar, biz, baz) =>
1462 @foo = foo
1463 @bar = bar
1464 @@biz = biz
1465 @@baz = baz
1466```
1467
1468</YueDisplay>
1469
1470Anda juga bisa menggunakan sintaks ini untuk fungsi umum guna menginisialisasi field objek. 731Anda juga bisa menggunakan sintaks ini untuk fungsi umum guna menginisialisasi field objek.
1471 732
1472```yuescript 733```yuescript
@@ -1475,16 +736,6 @@ obj = new {}, 123, "abc"
1475print obj 736print obj
1476``` 737```
1477 738
1478<YueDisplay>
1479
1480```yue
1481new = (@fieldA, @fieldB) => @
1482obj = new {}, 123, "abc"
1483print obj
1484```
1485
1486</YueDisplay>
1487
1488## Ekspresi Kelas 739## Ekspresi Kelas
1489 740
1490Sintaks kelas juga bisa digunakan sebagai ekspresi yang dapat di-assign ke variabel atau di-return secara eksplisit. 741Sintaks kelas juga bisa digunakan sebagai ekspresi yang dapat di-assign ke variabel atau di-return secara eksplisit.
@@ -1495,16 +746,6 @@ x = class Bucket
1495 add_drop: => @drops += 1 746 add_drop: => @drops += 1
1496``` 747```
1497 748
1498<YueDisplay>
1499
1500```yue
1501x = class Bucket
1502 drops: 0
1503 add_drop: => @drops += 1
1504```
1505
1506</YueDisplay>
1507
1508## Kelas Anonim 749## Kelas Anonim
1509 750
1510Nama bisa dihilangkan saat mendeklarasikan kelas. Atribut `__name` akan bernilai nil, kecuali ekspresi kelas berada dalam assignment. Nama di sisi kiri assignment digunakan sebagai ganti nil. 751Nama bisa dihilangkan saat mendeklarasikan kelas. Atribut `__name` akan bernilai nil, kecuali ekspresi kelas berada dalam assignment. Nama di sisi kiri assignment digunakan sebagai ganti nil.
@@ -1516,31 +757,12 @@ BigBucket = class extends Bucket
1516assert Bucket.__name == "BigBucket" 757assert Bucket.__name == "BigBucket"
1517``` 758```
1518 759
1519<YueDisplay>
1520
1521```yue
1522BigBucket = class extends Bucket
1523 add_drop: => @drops += 10
1524
1525assert Bucket.__name == "BigBucket"
1526```
1527
1528</YueDisplay>
1529
1530Anda bahkan bisa menghilangkan badan kelas, artinya Anda bisa menulis kelas anonim kosong seperti ini: 760Anda bahkan bisa menghilangkan badan kelas, artinya Anda bisa menulis kelas anonim kosong seperti ini:
1531 761
1532```yuescript 762```yuescript
1533x = class 763x = class
1534``` 764```
1535 765
1536<YueDisplay>
1537
1538```yue
1539x = class
1540```
1541
1542</YueDisplay>
1543
1544## Pencampuran Kelas 766## Pencampuran Kelas
1545 767
1546Anda bisa melakukan mixing dengan kata kunci `using` untuk menyalin fungsi dari tabel biasa atau objek kelas yang sudah didefinisikan ke kelas baru Anda. Saat mixing dengan tabel biasa, Anda dapat mengganti fungsi pengindeksan kelas (metamethod `__index`) dengan implementasi kustom. Saat mixing dengan objek kelas yang sudah ada, metamethod objek kelas tidak akan disalin. 768Anda bisa melakukan mixing dengan kata kunci `using` untuk menyalin fungsi dari tabel biasa atau objek kelas yang sudah didefinisikan ke kelas baru Anda. Saat mixing dengan tabel biasa, Anda dapat mengganti fungsi pengindeksan kelas (metamethod `__index`) dengan implementasi kustom. Saat mixing dengan objek kelas yang sudah ada, metamethod objek kelas tidak akan disalin.
@@ -1563,28 +785,6 @@ y\func!
1563assert y.__class.__parent ~= X -- X bukan parent dari Y 785assert y.__class.__parent ~= X -- X bukan parent dari Y
1564``` 786```
1565 787
1566<YueDisplay>
1567
1568```yue
1569MyIndex = __index: var: 1
1570
1571class X using MyIndex
1572 func: =>
1573 print 123
1574
1575x = X!
1576print x.var
1577
1578class Y using X
1579
1580y = Y!
1581y\func!
1582
1583assert y.__class.__parent ~= X -- X bukan parent dari Y
1584```
1585
1586</YueDisplay>
1587
1588# Pernyataan With 788# Pernyataan With
1589 789
1590Pola umum saat membuat objek adalah memanggil serangkaian fungsi dan mengatur serangkaian properti segera setelah objek dibuat. 790Pola umum saat membuat objek adalah memanggil serangkaian fungsi dan mengatur serangkaian properti segera setelah objek dibuat.
@@ -1603,18 +803,6 @@ with Person!
1603 print .name 803 print .name
1604``` 804```
1605 805
1606<YueDisplay>
1607
1608```yue
1609with Person!
1610 .name = "Oswald"
1611 \add_relative my_dad
1612 \save!
1613 print .name
1614```
1615
1616</YueDisplay>
1617
1618Pernyataan `with` juga bisa digunakan sebagai ekspresi yang mengembalikan nilai yang diberi akses. 806Pernyataan `with` juga bisa digunakan sebagai ekspresi yang mengembalikan nilai yang diberi akses.
1619 807
1620```yuescript 808```yuescript
@@ -1622,15 +810,6 @@ file = with File "favorite_foods.txt"
1622 \set_encoding "utf8" 810 \set_encoding "utf8"
1623``` 811```
1624 812
1625<YueDisplay>
1626
1627```yue
1628file = with File "favorite_foods.txt"
1629 \set_encoding "utf8"
1630```
1631
1632</YueDisplay>
1633
1634Ekspresi `with` mendukung `break` dengan satu nilai: 813Ekspresi `with` mendukung `break` dengan satu nilai:
1635 814
1636```yuescript 815```yuescript
@@ -1638,15 +817,6 @@ result = with obj
1638 break .value 817 break .value
1639``` 818```
1640 819
1641<YueDisplay>
1642
1643```yue
1644result = with obj
1645 break .value
1646```
1647
1648</YueDisplay>
1649
1650Setelah `break value` digunakan di dalam `with`, ekspresi `with` tidak lagi mengembalikan objek targetnya, melainkan mengembalikan nilai dari `break`. 820Setelah `break value` digunakan di dalam `with`, ekspresi `with` tidak lagi mengembalikan objek targetnya, melainkan mengembalikan nilai dari `break`.
1651 821
1652```yuescript 822```yuescript
@@ -1659,20 +829,6 @@ b = with obj
1659-- b adalah .x, bukan obj 829-- b adalah .x, bukan obj
1660``` 830```
1661 831
1662<YueDisplay>
1663
1664```yue
1665a = with obj
1666 .x = 1
1667-- a adalah obj
1668
1669b = with obj
1670 break .x
1671-- b adalah .x, bukan obj
1672```
1673
1674</YueDisplay>
1675
1676Berbeda dari `for` / `while` / `repeat` / `do`, `with` hanya mendukung satu nilai `break`. 832Berbeda dari `for` / `while` / `repeat` / `do`, `with` hanya mendukung satu nilai `break`.
1677 833
1678Atau… 834Atau…
@@ -1686,19 +842,6 @@ create_person = (name, relatives) ->
1686me = create_person "Leaf", [dad, mother, sister] 842me = create_person "Leaf", [dad, mother, sister]
1687``` 843```
1688 844
1689<YueDisplay>
1690
1691```yue
1692create_person = (name, relatives) ->
1693 with Person!
1694 .name = name
1695 \add_relative relative for relative in *relatives
1696
1697me = create_person "Leaf", [dad, mother, sister]
1698```
1699
1700</YueDisplay>
1701
1702Dalam penggunaan ini, `with` dapat dilihat sebagai bentuk khusus dari kombinator K. 845Dalam penggunaan ini, `with` dapat dilihat sebagai bentuk khusus dari kombinator K.
1703 846
1704Ekspresi pada pernyataan `with` juga bisa berupa assignment jika Anda ingin memberi nama pada ekspresi tersebut. 847Ekspresi pada pernyataan `with` juga bisa berupa assignment jika Anda ingin memberi nama pada ekspresi tersebut.
@@ -1709,16 +852,6 @@ with str := "Hello"
1709 print "upper:", \upper! 852 print "upper:", \upper!
1710``` 853```
1711 854
1712<YueDisplay>
1713
1714```yue
1715with str := "Hello"
1716 print "original:", str
1717 print "upper:", \upper!
1718```
1719
1720</YueDisplay>
1721
1722Anda bisa mengakses kunci khusus dengan `[]` di dalam pernyataan `with`. 855Anda bisa mengakses kunci khusus dengan `[]` di dalam pernyataan `with`.
1723 856
1724```yuescript 857```yuescript
@@ -1731,20 +864,6 @@ with tb
1731 [] = "abc" -- menambahkan ke "tb" 864 [] = "abc" -- menambahkan ke "tb"
1732``` 865```
1733 866
1734<YueDisplay>
1735
1736```yue
1737with tb
1738 [1] = 1
1739 print [2]
1740 with [abc]
1741 [3] = [2]\func!
1742 ["key-name"] = value
1743 [] = "abc" -- menambahkan ke "tb"
1744```
1745
1746</YueDisplay>
1747
1748`with?` adalah versi yang ditingkatkan dari sintaks `with`, yang memperkenalkan pengecekan keberadaan untuk mengakses objek yang mungkin nil secara aman tanpa pemeriksaan null eksplisit. 867`with?` adalah versi yang ditingkatkan dari sintaks `with`, yang memperkenalkan pengecekan keberadaan untuk mengakses objek yang mungkin nil secara aman tanpa pemeriksaan null eksplisit.
1749 868
1750```yuescript 869```yuescript
@@ -1752,15 +871,6 @@ with? obj
1752 print obj.name 871 print obj.name
1753``` 872```
1754 873
1755<YueDisplay>
1756
1757```yue
1758with? obj
1759 print obj.name
1760```
1761
1762</YueDisplay>
1763
1764# Penugasan 874# Penugasan
1765 875
1766Variabel bersifat bertipe dinamis dan secara default dideklarasikan sebagai local. Namun Anda dapat mengubah cakupan deklarasi dengan pernyataan **local** dan **global**. 876Variabel bersifat bertipe dinamis dan secara default dideklarasikan sebagai local. Namun Anda dapat mengubah cakupan deklarasi dengan pernyataan **local** dan **global**.
@@ -1771,16 +881,6 @@ a, b, c = 1, 2, 3
1771hello = 123 -- menggunakan variabel yang sudah ada 881hello = 123 -- menggunakan variabel yang sudah ada
1772``` 882```
1773 883
1774<YueDisplay>
1775
1776```yue
1777hello = "world"
1778a, b, c = 1, 2, 3
1779hello = 123 -- menggunakan variabel yang sudah ada
1780```
1781
1782</YueDisplay>
1783
1784## Pembaruan Nilai 884## Pembaruan Nilai
1785 885
1786Anda dapat melakukan assignment pembaruan dengan banyak operator biner. 886Anda dapat melakukan assignment pembaruan dengan banyak operator biner.
@@ -1796,21 +896,6 @@ s ..= "world" -- akan menambah local baru jika variabel local belum ada
1796arg or= "default value" 896arg or= "default value"
1797``` 897```
1798 898
1799<YueDisplay>
1800
1801```yue
1802x = 1
1803x += 1
1804x -= 1
1805x *= 10
1806x /= 10
1807x %= 10
1808s ..= "world" -- akan menambah local baru jika variabel local belum ada
1809arg or= "default value"
1810```
1811
1812</YueDisplay>
1813
1814## Assignment Berantai 899## Assignment Berantai
1815 900
1816Anda bisa melakukan assignment berantai untuk menetapkan beberapa item ke nilai yang sama. 901Anda bisa melakukan assignment berantai untuk menetapkan beberapa item ke nilai yang sama.
@@ -1820,15 +905,6 @@ a = b = c = d = e = 0
1820x = y = z = f! 905x = y = z = f!
1821``` 906```
1822 907
1823<YueDisplay>
1824
1825```yue
1826a = b = c = d = e = 0
1827x = y = z = f!
1828```
1829
1830</YueDisplay>
1831
1832## Local Eksplisit 908## Local Eksplisit
1833 909
1834```yuescript 910```yuescript
@@ -1848,27 +924,6 @@ do
1848 B = 2 924 B = 2
1849``` 925```
1850 926
1851<YueDisplay>
1852
1853```yue
1854do
1855 local a = 1
1856 local *
1857 print "deklarasikan semua variabel sebagai local di awal"
1858 x = -> 1 + y + z
1859 y, z = 2, 3
1860 global instance = Item\new!
1861
1862do
1863 local X = 1
1864 local ^
1865 print "hanya deklarasikan variabel huruf besar sebagai local di awal"
1866 a = 1
1867 B = 2
1868```
1869
1870</YueDisplay>
1871
1872## Global Eksplisit 927## Global Eksplisit
1873 928
1874```yuescript 929```yuescript
@@ -1888,27 +943,6 @@ do
1888 local Temp = "a local value" 943 local Temp = "a local value"
1889``` 944```
1890 945
1891<YueDisplay>
1892
1893```yue
1894do
1895 global a = 1
1896 global *
1897 print "deklarasikan semua variabel sebagai global"
1898 x = -> 1 + y + z
1899 y, z = 2, 3
1900
1901do
1902 global X = 1
1903 global ^
1904 print "hanya deklarasikan variabel huruf besar sebagai global"
1905 a = 1
1906 B = 2
1907 local Temp = "a local value"
1908```
1909
1910</YueDisplay>
1911
1912# Penugasan Varargs 946# Penugasan Varargs
1913 947
1914Anda dapat meng-assign hasil yang dikembalikan dari sebuah fungsi ke simbol varargs `...`. Lalu akses isinya menggunakan cara Lua. 948Anda dapat meng-assign hasil yang dikembalikan dari sebuah fungsi ke simbol varargs `...`. Lalu akses isinya menggunakan cara Lua.
@@ -1922,19 +956,6 @@ first = select 1, ...
1922print ok, count, first 956print ok, count, first
1923``` 957```
1924 958
1925<YueDisplay>
1926
1927```yue
1928list = [1, 2, 3, 4, 5]
1929fn = (ok) -> ok, table.unpack list
1930ok, ... = fn true
1931count = select '#', ...
1932first = select 1, ...
1933print ok, count, first
1934```
1935
1936</YueDisplay>
1937
1938# Penugasan pada If 959# Penugasan pada If
1939 960
1940Blok `if` dan `elseif` dapat menerima assignment sebagai ganti ekspresi kondisional. Saat kondisi dievaluasi, assignment akan dilakukan dan nilai yang di-assign akan digunakan sebagai ekspresi kondisional. Variabel yang di-assign hanya berada dalam scope badan kondisional, artinya tidak pernah tersedia jika nilai tidak truthy. Dan Anda harus menggunakan "walrus operator" `:=` sebagai ganti `=` untuk melakukan assignment. 961Blok `if` dan `elseif` dapat menerima assignment sebagai ganti ekspresi kondisional. Saat kondisi dievaluasi, assignment akan dilakukan dan nilai yang di-assign akan digunakan sebagai ekspresi kondisional. Variabel yang di-assign hanya berada dalam scope badan kondisional, artinya tidak pernah tersedia jika nilai tidak truthy. Dan Anda harus menggunakan "walrus operator" `:=` sebagai ganti `=` untuk melakukan assignment.
@@ -1944,15 +965,6 @@ if user := database.find_user "moon"
1944 print user.name 965 print user.name
1945``` 966```
1946 967
1947<YueDisplay>
1948
1949```yue
1950if user := database.find_user "moon"
1951 print user.name
1952```
1953
1954</YueDisplay>
1955
1956```yuescript 968```yuescript
1957if hello := os.getenv "hello" 969if hello := os.getenv "hello"
1958 print "You have hello", hello 970 print "You have hello", hello
@@ -1962,19 +974,6 @@ else
1962 print "nothing :(" 974 print "nothing :("
1963``` 975```
1964 976
1965<YueDisplay>
1966
1967```yue
1968if hello := os.getenv "hello"
1969 print "You have hello", hello
1970elseif world := os.getenv "world"
1971 print "you have world", world
1972else
1973 print "nothing :("
1974```
1975
1976</YueDisplay>
1977
1978Assignment if dengan beberapa nilai return. Hanya nilai pertama yang dicek, nilai lainnya tetap berada dalam scope. 977Assignment if dengan beberapa nilai return. Hanya nilai pertama yang dicek, nilai lainnya tetap berada dalam scope.
1979 978
1980```yuescript 979```yuescript
@@ -1983,16 +982,6 @@ if success, result := pcall -> "get result without problems"
1983print "OK" 982print "OK"
1984``` 983```
1985 984
1986<YueDisplay>
1987
1988```yue
1989if success, result := pcall -> "get result without problems"
1990 print result -- variabel result berada dalam scope
1991print "OK"
1992```
1993
1994</YueDisplay>
1995
1996## Assignment pada While 985## Assignment pada While
1997 986
1998Anda juga bisa menggunakan assignment if di loop while untuk mendapatkan nilai sebagai kondisi loop. 987Anda juga bisa menggunakan assignment if di loop while untuk mendapatkan nilai sebagai kondisi loop.
@@ -2003,16 +992,6 @@ while byte := stream\read_one!
2003 print byte 992 print byte
2004``` 993```
2005 994
2006<YueDisplay>
2007
2008```yue
2009while byte := stream\read_one!
2010 -- lakukan sesuatu dengan byte
2011 print byte
2012```
2013
2014</YueDisplay>
2015
2016# Penugasan Destrukturisasi 995# Penugasan Destrukturisasi
2017 996
2018Assignment destrukturisasi adalah cara cepat untuk mengekstrak nilai dari sebuah tabel berdasarkan nama kunci atau posisinya pada tabel berbasis array. 997Assignment destrukturisasi adalah cara cepat untuk mengekstrak nilai dari sebuah tabel berdasarkan nama kunci atau posisinya pada tabel berbasis array.
@@ -2028,17 +1007,6 @@ thing = [1, 2]
2028print a, b 1007print a, b
2029``` 1008```
2030 1009
2031<YueDisplay>
2032
2033```yue
2034thing = [1, 2]
2035
2036[a, b] = thing
2037print a, b
2038```
2039
2040</YueDisplay>
2041
2042Di literal tabel destrukturisasi, kunci mewakili kunci yang dibaca dari sisi kanan, dan nilai mewakili nama yang akan menerima nilai tersebut. 1010Di literal tabel destrukturisasi, kunci mewakili kunci yang dibaca dari sisi kanan, dan nilai mewakili nama yang akan menerima nilai tersebut.
2043 1011
2044```yuescript 1012```yuescript
@@ -2054,23 +1022,6 @@ print hello, the_day
2054:day = obj -- OK untuk destrukturisasi sederhana tanpa kurung 1022:day = obj -- OK untuk destrukturisasi sederhana tanpa kurung
2055``` 1023```
2056 1024
2057<YueDisplay>
2058
2059```yue
2060obj = {
2061 hello: "world"
2062 day: "tuesday"
2063 length: 20
2064}
2065
2066{hello: hello, day: the_day} = obj
2067print hello, the_day
2068
2069:day = obj -- OK untuk destrukturisasi sederhana tanpa kurung
2070```
2071
2072</YueDisplay>
2073
2074Ini juga bekerja pada struktur data bertingkat: 1025Ini juga bekerja pada struktur data bertingkat:
2075 1026
2076```yuescript 1027```yuescript
@@ -2086,23 +1037,6 @@ obj2 = {
2086print first, second, color 1037print first, second, color
2087``` 1038```
2088 1039
2089<YueDisplay>
2090
2091```yue
2092obj2 = {
2093 numbers: [1, 2, 3, 4]
2094 properties: {
2095 color: "green"
2096 height: 13.5
2097 }
2098}
2099
2100{numbers: [first, second], properties: {color: color}} = obj2
2101print first, second, color
2102```
2103
2104</YueDisplay>
2105
2106Jika pernyataan destrukturisasi kompleks, Anda bisa memecahnya ke beberapa baris. Contoh yang sedikit lebih rumit: 1040Jika pernyataan destrukturisasi kompleks, Anda bisa memecahnya ke beberapa baris. Contoh yang sedikit lebih rumit:
2107 1041
2108```yuescript 1042```yuescript
@@ -2114,75 +1048,30 @@ Jika pernyataan destrukturisasi kompleks, Anda bisa memecahnya ke beberapa baris
2114} = obj2 1048} = obj2
2115``` 1049```
2116 1050
2117<YueDisplay>
2118
2119```yue
2120{
2121 numbers: [first, second]
2122 properties: {
2123 color: color
2124 }
2125} = obj2
2126```
2127
2128</YueDisplay>
2129
2130Umumnya mengekstrak nilai dari tabel lalu menugaskannya ke variabel local dengan nama yang sama dengan kuncinya. Untuk menghindari pengulangan, kita bisa menggunakan operator prefiks **:**: 1051Umumnya mengekstrak nilai dari tabel lalu menugaskannya ke variabel local dengan nama yang sama dengan kuncinya. Untuk menghindari pengulangan, kita bisa menggunakan operator prefiks **:**:
2131 1052
2132```yuescript 1053```yuescript
2133{:concat, :insert} = table 1054{:concat, :insert} = table
2134``` 1055```
2135 1056
2136<YueDisplay>
2137
2138```yue
2139{:concat, :insert} = table
2140```
2141
2142</YueDisplay>
2143
2144Ini secara efektif sama seperti import, tetapi kita dapat mengganti nama field yang ingin diekstrak dengan menggabungkan sintaks: 1057Ini secara efektif sama seperti import, tetapi kita dapat mengganti nama field yang ingin diekstrak dengan menggabungkan sintaks:
2145 1058
2146```yuescript 1059```yuescript
2147{:mix, :max, random: rand} = math 1060{:mix, :max, random: rand} = math
2148``` 1061```
2149 1062
2150<YueDisplay>
2151
2152```yue
2153{:mix, :max, random: rand} = math
2154```
2155
2156</YueDisplay>
2157
2158Anda bisa menulis nilai default saat destrukturisasi seperti: 1063Anda bisa menulis nilai default saat destrukturisasi seperti:
2159 1064
2160```yuescript 1065```yuescript
2161{:name = "nameless", :job = "jobless"} = person 1066{:name = "nameless", :job = "jobless"} = person
2162``` 1067```
2163 1068
2164<YueDisplay>
2165
2166```yue
2167{:name = "nameless", :job = "jobless"} = person
2168```
2169
2170</YueDisplay>
2171
2172Anda dapat menggunakan `_` sebagai placeholder saat destrukturisasi list: 1069Anda dapat menggunakan `_` sebagai placeholder saat destrukturisasi list:
2173 1070
2174```yuescript 1071```yuescript
2175[_, two, _, four] = items 1072[_, two, _, four] = items
2176``` 1073```
2177 1074
2178<YueDisplay>
2179
2180```yue
2181[_, two, _, four] = items
2182```
2183
2184</YueDisplay>
2185
2186## Destrukturisasi Rentang 1075## Destrukturisasi Rentang
2187 1076
2188Anda dapat menggunakan operator spread `...` pada destrukturisasi list untuk menangkap rentang nilai. Ini berguna ketika Anda ingin mengekstrak elemen tertentu dari awal dan akhir list sambil mengumpulkan sisanya di tengah. 1077Anda dapat menggunakan operator spread `...` pada destrukturisasi list untuk menangkap rentang nilai. Ini berguna ketika Anda ingin mengekstrak elemen tertentu dari awal dan akhir list sambil mengumpulkan sisanya di tengah.
@@ -2195,18 +1084,6 @@ print bulk -- prints: {"second", "third", "fourth"}
2195print last -- prints: last 1084print last -- prints: last
2196``` 1085```
2197 1086
2198<YueDisplay>
2199
2200```yue
2201orders = ["first", "second", "third", "fourth", "last"]
2202[first, ...bulk, last] = orders
2203print first -- prints: first
2204print bulk -- prints: {"second", "third", "fourth"}
2205print last -- prints: last
2206```
2207
2208</YueDisplay>
2209
2210Operator spread dapat digunakan pada posisi berbeda untuk menangkap rentang yang berbeda, dan Anda bisa memakai `_` sebagai placeholder untuk nilai yang tidak ingin ditangkap: 1087Operator spread dapat digunakan pada posisi berbeda untuk menangkap rentang yang berbeda, dan Anda bisa memakai `_` sebagai placeholder untuk nilai yang tidak ingin ditangkap:
2211 1088
2212```yuescript 1089```yuescript
@@ -2220,21 +1097,6 @@ Operator spread dapat digunakan pada posisi berbeda untuk menangkap rentang yang
2220[first, ..._, last] = orders 1097[first, ..._, last] = orders
2221``` 1098```
2222 1099
2223<YueDisplay>
2224
2225```yue
2226-- Tangkap semuanya setelah elemen pertama
2227[first, ...rest] = orders
2228
2229-- Tangkap semuanya sebelum elemen terakhir
2230[...start, last] = orders
2231
2232-- Tangkap semuanya kecuali elemen tengah
2233[first, ..._, last] = orders
2234```
2235
2236</YueDisplay>
2237
2238## Destrukturisasi di Tempat Lain 1100## Destrukturisasi di Tempat Lain
2239 1101
2240Destrukturisasi juga dapat muncul di tempat-tempat di mana assignment terjadi secara implisit. Contohnya adalah perulangan for: 1102Destrukturisasi juga dapat muncul di tempat-tempat di mana assignment terjadi secara implisit. Contohnya adalah perulangan for:
@@ -2249,20 +1111,6 @@ for [left, right] in *tuples
2249 print left, right 1111 print left, right
2250``` 1112```
2251 1113
2252<YueDisplay>
2253
2254```yue
2255tuples = [
2256 ["hello", "world"]
2257 ["egg", "head"]
2258]
2259
2260for [left, right] in *tuples
2261 print left, right
2262```
2263
2264</YueDisplay>
2265
2266Kita tahu setiap elemen pada tabel array adalah tuple dua item, sehingga kita dapat membongkarnya langsung di klausa nama pada pernyataan for menggunakan destrukturisasi. 1114Kita tahu setiap elemen pada tabel array adalah tuple dua item, sehingga kita dapat membongkarnya langsung di klausa nama pada pernyataan for menggunakan destrukturisasi.
2267 1115
2268# Klausa Using; Mengendalikan Penugasan Destruktif 1116# Klausa Using; Mengendalikan Penugasan Destruktif
@@ -2285,26 +1133,6 @@ my_func!
2285print i -- akan mencetak 0 1133print i -- akan mencetak 0
2286``` 1134```
2287 1135
2288<YueDisplay>
2289
2290```yue
2291i = 100
2292
2293-- banyak baris kode...
2294
2295my_func = ->
2296 i = 10
2297 while i > 0
2298 print i
2299 i -= 1
2300
2301my_func!
2302
2303print i -- akan mencetak 0
2304```
2305
2306</YueDisplay>
2307
2308Di `my_func`, kita tanpa sengaja menimpa nilai `i`. Dalam contoh ini halnya cukup jelas, tetapi bayangkan kode besar atau basis kode asing di mana tidak jelas nama apa saja yang sudah dideklarasikan. 1136Di `my_func`, kita tanpa sengaja menimpa nilai `i`. Dalam contoh ini halnya cukup jelas, tetapi bayangkan kode besar atau basis kode asing di mana tidak jelas nama apa saja yang sudah dideklarasikan.
2309 1137
2310Akan sangat membantu jika kita dapat menyatakan variabel mana dari scope luar yang memang ingin kita ubah, agar mencegah mengubah yang lain secara tidak sengaja. 1138Akan sangat membantu jika kita dapat menyatakan variabel mana dari scope luar yang memang ingin kita ubah, agar mencegah mengubah yang lain secara tidak sengaja.
@@ -2321,20 +1149,6 @@ my_func!
2321print i -- mencetak 100, i tidak terpengaruh 1149print i -- mencetak 100, i tidak terpengaruh
2322``` 1150```
2323 1151
2324<YueDisplay>
2325
2326```yue
2327i = 100
2328
2329my_func = (using nil) ->
2330 i = "hello" -- variabel local baru dibuat di sini
2331
2332my_func!
2333print i -- mencetak 100, i tidak terpengaruh
2334```
2335
2336</YueDisplay>
2337
2338Beberapa nama dapat dipisahkan dengan koma. Nilai closure tetap bisa diakses, hanya saja tidak dapat dimodifikasi: 1152Beberapa nama dapat dipisahkan dengan koma. Nilai closure tetap bisa diakses, hanya saja tidak dapat dimodifikasi:
2339 1153
2340```yuescript 1154```yuescript
@@ -2350,23 +1164,6 @@ my_func(22)
2350print i, k -- ini telah diperbarui 1164print i, k -- ini telah diperbarui
2351``` 1165```
2352 1166
2353<YueDisplay>
2354
2355```yue
2356tmp = 1213
2357i, k = 100, 50
2358
2359my_func = (add using k, i) ->
2360 tmp = tmp + add -- tmp local baru dibuat
2361 i += tmp
2362 k += tmp
2363
2364my_func(22)
2365print i, k -- ini telah diperbarui
2366```
2367
2368</YueDisplay>
2369
2370# Penggunaan 1167# Penggunaan
2371 1168
2372## Modul Lua 1169## Modul Lua
@@ -2535,55 +1332,6 @@ with apple
2535export 🌛 = "Skrip Bulan" 1332export 🌛 = "Skrip Bulan"
2536``` 1333```
2537 1334
2538<YueDisplay>
2539
2540```yue
2541-- import syntax
2542import p, to_lua from "yue"
2543
2544-- object literals
2545inventory =
2546 equipment:
2547 - "sword"
2548 - "shield"
2549 items:
2550 - name: "potion"
2551 count: 10
2552 - name: "bread"
2553 count: 3
2554
2555-- list comprehension
2556map = (arr, action) ->
2557 [action item for item in *arr]
2558
2559filter = (arr, cond) ->
2560 [item for item in *arr when cond item]
2561
2562reduce = (arr, init, action): init ->
2563 init = action init, item for item in *arr
2564
2565-- pipe operator
2566[1, 2, 3]
2567 |> map (x) -> x * 2
2568 |> filter (x) -> x > 4
2569 |> reduce 0, (a, b) -> a + b
2570 |> print
2571
2572-- metatable manipulation
2573apple =
2574 size: 15
2575 <index>:
2576 color: 0x00ffff
2577
2578with apple
2579 p .size, .color, .<index> if .<>?
2580
2581-- js-like export syntax
2582export 🌛 = "Skrip Bulan"
2583```
2584
2585</YueDisplay>
2586
2587## Tentang Dora SSR 1335## Tentang Dora SSR
2588 1336
2589YueScript dikembangkan dan dipelihara bersama mesin game open-source [Dora SSR](https://github.com/Dora-SSR/Dora-SSR). YueScript telah digunakan untuk membuat alat mesin, demo game, dan prototipe, membuktikan kemampuannya dalam skenario dunia nyata sekaligus meningkatkan pengalaman pengembangan Dora SSR. 1337YueScript dikembangkan dan dipelihara bersama mesin game open-source [Dora SSR](https://github.com/Dora-SSR/Dora-SSR). YueScript telah digunakan untuk membuat alat mesin, demo game, dan prototipe, membuktikan kemampuannya dalam skenario dunia nyata sekaligus meningkatkan pengalaman pengembangan Dora SSR.
@@ -2642,18 +1390,6 @@ else
2642 print "Tidak ada koin" 1390 print "Tidak ada koin"
2643``` 1391```
2644 1392
2645<YueDisplay>
2646
2647```yue
2648have_coins = false
2649if have_coins
2650 print "Dapat koin"
2651else
2652 print "Tidak ada koin"
2653```
2654
2655</YueDisplay>
2656
2657Sintaks pendek untuk pernyataan tunggal juga bisa digunakan: 1393Sintaks pendek untuk pernyataan tunggal juga bisa digunakan:
2658 1394
2659```yuescript 1395```yuescript
@@ -2661,15 +1397,6 @@ have_coins = false
2661if have_coins then print "Dapat koin" else print "Tidak ada koin" 1397if have_coins then print "Dapat koin" else print "Tidak ada koin"
2662``` 1398```
2663 1399
2664<YueDisplay>
2665
2666```yue
2667have_coins = false
2668if have_coins then print "Dapat koin" else print "Tidak ada koin"
2669```
2670
2671</YueDisplay>
2672
2673Karena pernyataan if dapat digunakan sebagai ekspresi, ini juga bisa ditulis sebagai: 1400Karena pernyataan if dapat digunakan sebagai ekspresi, ini juga bisa ditulis sebagai:
2674 1401
2675```yuescript 1402```yuescript
@@ -2677,15 +1404,6 @@ have_coins = false
2677print if have_coins then "Dapat koin" else "Tidak ada koin" 1404print if have_coins then "Dapat koin" else "Tidak ada koin"
2678``` 1405```
2679 1406
2680<YueDisplay>
2681
2682```yue
2683have_coins = false
2684print if have_coins then "Dapat koin" else "Tidak ada koin"
2685```
2686
2687</YueDisplay>
2688
2689Kondisional juga bisa digunakan di pernyataan return dan assignment: 1407Kondisional juga bisa digunakan di pernyataan return dan assignment:
2690 1408
2691```yuescript 1409```yuescript
@@ -2703,25 +1421,6 @@ else
2703print message -- prints: Saya sangat tinggi 1421print message -- prints: Saya sangat tinggi
2704``` 1422```
2705 1423
2706<YueDisplay>
2707
2708```yue
2709is_tall = (name) ->
2710 if name == "Rob"
2711 true
2712 else
2713 false
2714
2715message = if is_tall "Rob"
2716 "Saya sangat tinggi"
2717else
2718 "Saya tidak terlalu tinggi"
2719
2720print message -- prints: Saya sangat tinggi
2721```
2722
2723</YueDisplay>
2724
2725Kebalikan dari if adalah unless: 1424Kebalikan dari if adalah unless:
2726 1425
2727```yuescript 1426```yuescript
@@ -2729,27 +1428,10 @@ unless os.date("%A") == "Monday"
2729 print "hari ini bukan Senin!" 1428 print "hari ini bukan Senin!"
2730``` 1429```
2731 1430
2732<YueDisplay>
2733
2734```yue
2735unless os.date("%A") == "Monday"
2736 print "hari ini bukan Senin!"
2737```
2738
2739</YueDisplay>
2740
2741```yuescript 1431```yuescript
2742print "Kamu beruntung!" unless math.random! > 0.1 1432print "Kamu beruntung!" unless math.random! > 0.1
2743``` 1433```
2744 1434
2745<YueDisplay>
2746
2747```yue
2748print "Kamu beruntung!" unless math.random! > 0.1
2749```
2750
2751</YueDisplay>
2752
2753## Ekspresi In 1435## Ekspresi In
2754 1436
2755Anda dapat menulis kode pengecekan rentang dengan `ekspresi in`. 1437Anda dapat menulis kode pengecekan rentang dengan `ekspresi in`.
@@ -2764,20 +1446,6 @@ if a in list
2764 print "memeriksa apakah `a` ada di dalam daftar" 1446 print "memeriksa apakah `a` ada di dalam daftar"
2765``` 1447```
2766 1448
2767<YueDisplay>
2768
2769```yue
2770a = 5
2771
2772if a in [1, 3, 5, 7]
2773 print "memeriksa kesamaan dengan nilai-nilai diskrit"
2774
2775if a in list
2776 print "memeriksa apakah `a` ada di dalam daftar"
2777```
2778
2779</YueDisplay>
2780
2781Operator `in` juga dapat digunakan dengan tabel dan mendukung varian `not in` untuk negasi: 1449Operator `in` juga dapat digunakan dengan tabel dan mendukung varian `not in` untuk negasi:
2782 1450
2783```yuescript 1451```yuescript
@@ -2791,21 +1459,6 @@ not_exist = item not in list
2791check = -> value not in table 1459check = -> value not in table
2792``` 1460```
2793 1461
2794<YueDisplay>
2795
2796```yue
2797has = "foo" in {"bar", "foo"}
2798
2799if a in {1, 2, 3}
2800 print "a ada di dalam tabel"
2801
2802not_exist = item not in list
2803
2804check = -> value not in table
2805```
2806
2807</YueDisplay>
2808
2809Daftar atau tabel dengan satu elemen memeriksa kesamaan dengan elemen tersebut: 1462Daftar atau tabel dengan satu elemen memeriksa kesamaan dengan elemen tersebut:
2810 1463
2811```yuescript 1464```yuescript
@@ -2820,22 +1473,6 @@ with tb
2820 c = a in [1] 1473 c = a in [1]
2821``` 1474```
2822 1475
2823<YueDisplay>
2824
2825```yue
2826-- [1,] memeriksa apakah nilai == 1
2827c = a in [1,]
2828
2829-- {1} juga memeriksa apakah nilai == 1
2830c = a in {1}
2831
2832-- Tanpa koma, [1] adalah akses indeks (tb[1])
2833with tb
2834 c = a in [1]
2835```
2836
2837</YueDisplay>
2838
2839# Perulangan For 1476# Perulangan For
2840 1477
2841Ada dua bentuk perulangan for, seperti di Lua. Satu numerik dan satu generik: 1478Ada dua bentuk perulangan for, seperti di Lua. Satu numerik dan satu generik:
@@ -2851,21 +1488,6 @@ for key, value in pairs object
2851 print key, value 1488 print key, value
2852``` 1489```
2853 1490
2854<YueDisplay>
2855
2856```yue
2857for i = 10, 20
2858 print i
2859
2860for k = 1, 15, 2 -- an optional step provided
2861 print k
2862
2863for key, value in pairs object
2864 print key, value
2865```
2866
2867</YueDisplay>
2868
2869Operator slicing dan **\*** dapat digunakan, seperti pada comprehension: 1491Operator slicing dan **\*** dapat digunakan, seperti pada comprehension:
2870 1492
2871```yuescript 1493```yuescript
@@ -2873,15 +1495,6 @@ for item in *items[2, 4]
2873 print item 1495 print item
2874``` 1496```
2875 1497
2876<YueDisplay>
2877
2878```yue
2879for item in *items[2, 4]
2880 print item
2881```
2882
2883</YueDisplay>
2884
2885Sintaks yang lebih singkat juga tersedia untuk semua variasi ketika badan hanya satu baris: 1498Sintaks yang lebih singkat juga tersedia untuk semua variasi ketika badan hanya satu baris:
2886 1499
2887```yuescript 1500```yuescript
@@ -2890,16 +1503,6 @@ for item in *items do print item
2890for j = 1, 10, 3 do print j 1503for j = 1, 10, 3 do print j
2891``` 1504```
2892 1505
2893<YueDisplay>
2894
2895```yue
2896for item in *items do print item
2897
2898for j = 1, 10, 3 do print j
2899```
2900
2901</YueDisplay>
2902
2903Perulangan for juga bisa digunakan sebagai ekspresi. Pernyataan terakhir di badan for dipaksa menjadi ekspresi dan ditambahkan ke tabel array yang terakumulasi. 1506Perulangan for juga bisa digunakan sebagai ekspresi. Pernyataan terakhir di badan for dipaksa menjadi ekspresi dan ditambahkan ke tabel array yang terakumulasi.
2904 1507
2905Menggandakan setiap bilangan genap: 1508Menggandakan setiap bilangan genap:
@@ -2912,18 +1515,6 @@ doubled_evens = for i = 1, 20
2912 i 1515 i
2913``` 1516```
2914 1517
2915<YueDisplay>
2916
2917```yue
2918doubled_evens = for i = 1, 20
2919 if i % 2 == 0
2920 i * 2
2921 else
2922 i
2923```
2924
2925</YueDisplay>
2926
2927Selain itu, loop for mendukung break dengan nilai kembalian, sehingga loop itu sendiri bisa dipakai sebagai ekspresi yang keluar lebih awal dengan hasil bermakna. Ekspresi `for` mendukung `break` dengan banyak nilai. 1518Selain itu, loop for mendukung break dengan nilai kembalian, sehingga loop itu sendiri bisa dipakai sebagai ekspresi yang keluar lebih awal dengan hasil bermakna. Ekspresi `for` mendukung `break` dengan banyak nilai.
2928 1519
2929Contohnya, untuk menemukan angka pertama yang lebih besar dari 10: 1520Contohnya, untuk menemukan angka pertama yang lebih besar dari 10:
@@ -2933,15 +1524,6 @@ first_large = for n in *numbers
2933 break n if n > 10 1524 break n if n > 10
2934``` 1525```
2935 1526
2936<YueDisplay>
2937
2938```yue
2939first_large = for n in *numbers
2940 break n if n > 10
2941```
2942
2943</YueDisplay>
2944
2945Sintaks break-dengan-nilai ini memungkinkan pola pencarian atau keluar-lebih-awal yang ringkas langsung di dalam ekspresi loop. 1527Sintaks break-dengan-nilai ini memungkinkan pola pencarian atau keluar-lebih-awal yang ringkas langsung di dalam ekspresi loop.
2946 1528
2947```yuescript 1529```yuescript
@@ -2949,15 +1531,6 @@ key, score = for k, v in pairs data
2949 break k, v * 10 if k == "target" 1531 break k, v * 10 if k == "target"
2950``` 1532```
2951 1533
2952<YueDisplay>
2953
2954```yue
2955key, score = for k, v in pairs data
2956 break k, v * 10 if k == "target"
2957```
2958
2959</YueDisplay>
2960
2961Anda juga bisa memfilter nilai dengan menggabungkan ekspresi for dengan pernyataan continue. 1534Anda juga bisa memfilter nilai dengan menggabungkan ekspresi for dengan pernyataan continue.
2962 1535
2963Loop for di akhir badan fungsi tidak diakumulasikan menjadi tabel untuk nilai kembalian (sebaliknya fungsi akan mengembalikan nil). Gunakan pernyataan return eksplisit, atau ubah loop menjadi list comprehension. 1536Loop for di akhir badan fungsi tidak diakumulasikan menjadi tabel untuk nilai kembalian (sebaliknya fungsi akan mengembalikan nil). Gunakan pernyataan return eksplisit, atau ubah loop menjadi list comprehension.
@@ -2970,18 +1543,6 @@ print func_a! -- prints nil
2970print func_b! -- prints table object 1543print func_b! -- prints table object
2971``` 1544```
2972 1545
2973<YueDisplay>
2974
2975```yue
2976func_a = -> for i = 1, 10 do print i
2977func_b = -> return for i = 1, 10 do i
2978
2979print func_a! -- prints nil
2980print func_b! -- prints table object
2981```
2982
2983</YueDisplay>
2984
2985# Pernyataan Continue 1546# Pernyataan Continue
2986 1547
2987Pernyataan continue dapat digunakan untuk melewati iterasi saat ini di dalam loop. 1548Pernyataan continue dapat digunakan untuk melewati iterasi saat ini di dalam loop.
@@ -2994,18 +1555,6 @@ while i < 10
2994 print i 1555 print i
2995``` 1556```
2996 1557
2997<YueDisplay>
2998
2999```yue
3000i = 0
3001while i < 10
3002 i += 1
3003 continue if i % 2 == 0
3004 print i
3005```
3006
3007</YueDisplay>
3008
3009continue juga bisa digunakan bersama ekspresi loop untuk mencegah iterasi tersebut diakumulasikan ke hasil. Contoh ini memfilter tabel array menjadi hanya angka genap: 1558continue juga bisa digunakan bersama ekspresi loop untuk mencegah iterasi tersebut diakumulasikan ke hasil. Contoh ini memfilter tabel array menjadi hanya angka genap:
3010 1559
3011```yuescript 1560```yuescript
@@ -3015,17 +1564,6 @@ odds = for x in *my_numbers
3015 x 1564 x
3016``` 1565```
3017 1566
3018<YueDisplay>
3019
3020```yue
3021my_numbers = [1, 2, 3, 4, 5, 6]
3022odds = for x in *my_numbers
3023 continue if x % 2 == 1
3024 x
3025```
3026
3027</YueDisplay>
3028
3029# Pernyataan Switch 1567# Pernyataan Switch
3030 1568
3031Pernyataan switch adalah bentuk singkat untuk menulis serangkaian if yang membandingkan nilai yang sama. Perhatikan bahwa nilainya hanya dievaluasi sekali. Seperti if, switch bisa memiliki blok else untuk menangani tidak ada yang cocok. Perbandingan dilakukan dengan operator `==`. Di dalam switch, Anda juga bisa memakai ekspresi assignment untuk menyimpan nilai variabel sementara. 1569Pernyataan switch adalah bentuk singkat untuk menulis serangkaian if yang membandingkan nilai yang sama. Perhatikan bahwa nilainya hanya dievaluasi sekali. Seperti if, switch bisa memiliki blok else untuk menangani tidak ada yang cocok. Perbandingan dilakukan dengan operator `==`. Di dalam switch, Anda juga bisa memakai ekspresi assignment untuk menyimpan nilai variabel sementara.
@@ -3040,20 +1578,6 @@ switch name := "Dan"
3040 print "I don't know about you with name #{name}" 1578 print "I don't know about you with name #{name}"
3041``` 1579```
3042 1580
3043<YueDisplay>
3044
3045```yue
3046switch name := "Dan"
3047 when "Robert"
3048 print "You are Robert"
3049 when "Dan", "Daniel"
3050 print "Your name, it's Dan"
3051 else
3052 print "I don't know about you with name #{name}"
3053```
3054
3055</YueDisplay>
3056
3057Klausa when pada switch bisa mencocokkan beberapa nilai dengan menuliskannya dipisah koma. 1581Klausa when pada switch bisa mencocokkan beberapa nilai dengan menuliskannya dipisah koma.
3058 1582
3059Switch juga bisa dipakai sebagai ekspresi; di sini kita dapat menetapkan hasil switch ke sebuah variabel: 1583Switch juga bisa dipakai sebagai ekspresi; di sini kita dapat menetapkan hasil switch ke sebuah variabel:
@@ -3069,21 +1593,6 @@ next_number = switch b
3069 error "can't count that high!" 1593 error "can't count that high!"
3070``` 1594```
3071 1595
3072<YueDisplay>
3073
3074```yue
3075b = 1
3076next_number = switch b
3077 when 1
3078 2
3079 when 2
3080 3
3081 else
3082 error "can't count that high!"
3083```
3084
3085</YueDisplay>
3086
3087Kita bisa memakai kata kunci `then` untuk menulis blok when switch pada satu baris. Tidak ada kata kunci tambahan yang dibutuhkan untuk menulis blok else pada satu baris. 1596Kita bisa memakai kata kunci `then` untuk menulis blok when switch pada satu baris. Tidak ada kata kunci tambahan yang dibutuhkan untuk menulis blok else pada satu baris.
3088 1597
3089```yuescript 1598```yuescript
@@ -3093,17 +1602,6 @@ msg = switch math.random(1, 5)
3093 else "not so lucky" 1602 else "not so lucky"
3094``` 1603```
3095 1604
3096<YueDisplay>
3097
3098```yue
3099msg = switch math.random(1, 5)
3100 when 1 then "you are lucky"
3101 when 2 then "you are almost lucky"
3102 else "not so lucky"
3103```
3104
3105</YueDisplay>
3106
3107Jika Anda ingin menulis kode dengan satu indentasi lebih sedikit saat menulis switch, Anda bisa menaruh klausa when pertama pada baris awal pernyataan, lalu semua klausa lain dapat ditulis dengan satu indentasi lebih sedikit. 1605Jika Anda ingin menulis kode dengan satu indentasi lebih sedikit saat menulis switch, Anda bisa menaruh klausa when pertama pada baris awal pernyataan, lalu semua klausa lain dapat ditulis dengan satu indentasi lebih sedikit.
3108 1606
3109```yuescript 1607```yuescript
@@ -3119,23 +1617,6 @@ else
3119 print "not so lucky" 1617 print "not so lucky"
3120``` 1618```
3121 1619
3122<YueDisplay>
3123
3124```yue
3125switch math.random(1, 5)
3126 when 1
3127 print "you are lucky" -- two indents
3128 else
3129 print "not so lucky"
3130
3131switch math.random(1, 5) when 1
3132 print "you are lucky" -- one indent
3133else
3134 print "not so lucky"
3135```
3136
3137</YueDisplay>
3138
3139Perlu dicatat urutan ekspresi perbandingan kasus. Ekspresi kasus berada di sisi kiri. Ini bisa berguna jika ekspresi kasus ingin mengganti cara perbandingan dengan mendefinisikan metamethod `eq`. 1620Perlu dicatat urutan ekspresi perbandingan kasus. Ekspresi kasus berada di sisi kiri. Ini bisa berguna jika ekspresi kasus ingin mengganti cara perbandingan dengan mendefinisikan metamethod `eq`.
3140 1621
3141## Pencocokan Tabel 1622## Pencocokan Tabel
@@ -3157,25 +1638,6 @@ for item in *items
3157 print "size #{width}, #{height}" 1638 print "size #{width}, #{height}"
3158``` 1639```
3159 1640
3160<YueDisplay>
3161
3162```yue
3163items =
3164 * x: 100
3165 y: 200
3166 * width: 300
3167 height: 400
3168
3169for item in *items
3170 switch item
3171 when :x, :y
3172 print "Vec2 #{x}, #{y}"
3173 when :width, :height
3174 print "size #{width}, #{height}"
3175```
3176
3177</YueDisplay>
3178
3179Anda dapat menggunakan nilai default untuk mendestrukturisasi tabel secara opsional pada beberapa field. 1641Anda dapat menggunakan nilai default untuk mendestrukturisasi tabel secara opsional pada beberapa field.
3180 1642
3181```yuescript 1643```yuescript
@@ -3188,20 +1650,6 @@ switch item
3188 print "Vec2 #{x}, #{y}" -- table destructuring will still pass 1650 print "Vec2 #{x}, #{y}" -- table destructuring will still pass
3189``` 1651```
3190 1652
3191<YueDisplay>
3192
3193```yue
3194item = {}
3195
3196{pos: {:x = 50, :y = 200}} = item -- get error: attempt to index a nil value (field 'pos')
3197
3198switch item
3199 when {pos: {:x = 50, :y = 200}}
3200 print "Vec2 #{x}, #{y}" -- table destructuring will still pass
3201```
3202
3203</YueDisplay>
3204
3205Anda juga bisa mencocokkan elemen array, field tabel, dan bahkan struktur bertingkat dengan literal array atau tabel. 1653Anda juga bisa mencocokkan elemen array, field tabel, dan bahkan struktur bertingkat dengan literal array atau tabel.
3206 1654
3207Cocokkan terhadap elemen array. 1655Cocokkan terhadap elemen array.
@@ -3216,20 +1664,6 @@ switch tb
3216 print "1, 2, #{b}" 1664 print "1, 2, #{b}"
3217``` 1665```
3218 1666
3219<YueDisplay>
3220
3221```yue
3222switch tb
3223 when [1, 2, 3]
3224 print "1, 2, 3"
3225 when [1, b, 3]
3226 print "1, #{b}, 3"
3227 when [1, 2, b = 3] -- b has a default value
3228 print "1, 2, #{b}"
3229```
3230
3231</YueDisplay>
3232
3233Cocokkan terhadap field tabel dengan destrukturisasi. 1667Cocokkan terhadap field tabel dengan destrukturisasi.
3234 1668
3235```yuescript 1669```yuescript
@@ -3242,20 +1676,6 @@ switch tb
3242 print "invalid" 1676 print "invalid"
3243``` 1677```
3244 1678
3245<YueDisplay>
3246
3247```yue
3248switch tb
3249 when success: true, :result
3250 print "success", result
3251 when success: false
3252 print "failed", result
3253 else
3254 print "invalid"
3255```
3256
3257</YueDisplay>
3258
3259Cocokkan terhadap struktur tabel bertingkat. 1679Cocokkan terhadap struktur tabel bertingkat.
3260 1680
3261```yuescript 1681```yuescript
@@ -3268,20 +1688,6 @@ switch tb
3268 print "invalid" 1688 print "invalid"
3269``` 1689```
3270 1690
3271<YueDisplay>
3272
3273```yue
3274switch tb
3275 when data: {type: "success", :content}
3276 print "success", content
3277 when data: {type: "error", :content}
3278 print "failed", content
3279 else
3280 print "invalid"
3281```
3282
3283</YueDisplay>
3284
3285Cocokkan terhadap array dari tabel. 1691Cocokkan terhadap array dari tabel.
3286 1692
3287```yuescript 1693```yuescript
@@ -3295,21 +1701,6 @@ switch tb
3295 print "matched", fourth 1701 print "matched", fourth
3296``` 1702```
3297 1703
3298<YueDisplay>
3299
3300```yue
3301switch tb
3302 when [
3303 {a: 1, b: 2}
3304 {a: 3, b: 4}
3305 {a: 5, b: 6}
3306 fourth
3307 ]
3308 print "matched", fourth
3309```
3310
3311</YueDisplay>
3312
3313Cocokkan terhadap daftar dan tangkap rentang elemen. 1704Cocokkan terhadap daftar dan tangkap rentang elemen.
3314 1705
3315```yuescript 1706```yuescript
@@ -3321,19 +1712,6 @@ switch segments
3321 print "Action:", action -- prints: "view" 1712 print "Action:", action -- prints: "view"
3322``` 1713```
3323 1714
3324<YueDisplay>
3325
3326```yue
3327segments = ["admin", "users", "logs", "view"]
3328switch segments
3329 when [...groups, resource, action]
3330 print "Group:", groups -- prints: {"admin", "users"}
3331 print "Resource:", resource -- prints: "logs"
3332 print "Action:", action -- prints: "view"
3333```
3334
3335</YueDisplay>
3336
3337# Perulangan While 1715# Perulangan While
3338 1716
3339Perulangan while juga memiliki empat variasi: 1717Perulangan while juga memiliki empat variasi:
@@ -3347,19 +1725,6 @@ while i > 0
3347while running == true do my_function! 1725while running == true do my_function!
3348``` 1726```
3349 1727
3350<YueDisplay>
3351
3352```yue
3353i = 10
3354while i > 0
3355 print i
3356 i -= 1
3357
3358while running == true do my_function!
3359```
3360
3361</YueDisplay>
3362
3363```yuescript 1728```yuescript
3364i = 10 1729i = 10
3365until i == 0 1730until i == 0
@@ -3369,18 +1734,6 @@ until i == 0
3369until running == false do my_function! 1734until running == false do my_function!
3370``` 1735```
3371 1736
3372<YueDisplay>
3373
3374```yue
3375i = 10
3376until i == 0
3377 print i
3378 i -= 1
3379until running == false do my_function!
3380```
3381
3382</YueDisplay>
3383
3384Seperti loop for, loop while juga bisa digunakan sebagai ekspresi. Ekspresi `while` dan `until` mendukung `break` dengan banyak nilai. 1737Seperti loop for, loop while juga bisa digunakan sebagai ekspresi. Ekspresi `while` dan `until` mendukung `break` dengan banyak nilai.
3385 1738
3386```yuescript 1739```yuescript
@@ -3389,16 +1742,6 @@ value, doubled = while true
3389 break n, n * 2 if n > 10 1742 break n, n * 2 if n > 10
3390``` 1743```
3391 1744
3392<YueDisplay>
3393
3394```yue
3395value, doubled = while true
3396 n = get_next!
3397 break n, n * 2 if n > 10
3398```
3399
3400</YueDisplay>
3401
3402Selain itu, agar sebuah fungsi mengembalikan nilai akumulasi dari loop while, pernyataannya harus di-return secara eksplisit. 1745Selain itu, agar sebuah fungsi mengembalikan nilai akumulasi dari loop while, pernyataannya harus di-return secara eksplisit.
3403 1746
3404## Repeat Loop 1747## Repeat Loop
@@ -3413,18 +1756,6 @@ repeat
3413until i == 0 1756until i == 0
3414``` 1757```
3415 1758
3416<YueDisplay>
3417
3418```yue
3419i = 10
3420repeat
3421 print i
3422 i -= 1
3423until i == 0
3424```
3425
3426</YueDisplay>
3427
3428Ekspresi `repeat` juga mendukung `break` dengan banyak nilai: 1759Ekspresi `repeat` juga mendukung `break` dengan banyak nilai:
3429 1760
3430```yuescript 1761```yuescript
@@ -3435,18 +1766,6 @@ value, scaled = repeat
3435until false 1766until false
3436``` 1767```
3437 1768
3438<YueDisplay>
3439
3440```yue
3441i = 1
3442value, scaled = repeat
3443 break i, i * 100 if i > 3
3444 i += 1
3445until false
3446```
3447
3448</YueDisplay>
3449
3450# Stub Fungsi 1769# Stub Fungsi
3451 1770
3452Sering kali fungsi dari sebuah objek diteruskan sebagai nilai, misalnya meneruskan method instance ke fungsi lain sebagai callback. Jika fungsi mengharapkan objek yang dioperasikan sebagai argumen pertama, maka Anda harus menggabungkan objek tersebut dengan fungsi agar dapat dipanggil dengan benar. 1771Sering kali fungsi dari sebuah objek diteruskan sebagai nilai, misalnya meneruskan method instance ke fungsi lain sebagai callback. Jika fungsi mengharapkan objek yang dioperasikan sebagai argumen pertama, maka Anda harus menggabungkan objek tersebut dengan fungsi agar dapat dipanggil dengan benar.
@@ -3474,29 +1793,6 @@ run_callback my_object.write
3474run_callback my_object\write 1793run_callback my_object\write
3475``` 1794```
3476 1795
3477<YueDisplay>
3478
3479```yue
3480my_object = {
3481 value: 1000
3482 write: => print "the value:", @value
3483}
3484
3485run_callback = (func) ->
3486 print "running callback..."
3487 func!
3488
3489-- ini tidak akan berfungsi:
3490-- fungsi tidak memiliki referensi ke my_object
3491run_callback my_object.write
3492
3493-- sintaks stub fungsi
3494-- memungkinkan kita membundel objek ke fungsi baru
3495run_callback my_object\write
3496```
3497
3498</YueDisplay>
3499
3500# Backcall 1796# Backcall
3501 1797
3502Backcall digunakan untuk meratakan callback yang bersarang. Backcall didefinisikan menggunakan panah yang mengarah ke kiri sebagai parameter terakhir secara default yang akan mengisi pemanggilan fungsi. Semua sintaks pada dasarnya sama seperti fungsi panah biasa, kecuali arahnya berlawanan dan badan fungsi tidak memerlukan indentasi. 1798Backcall digunakan untuk meratakan callback yang bersarang. Backcall didefinisikan menggunakan panah yang mengarah ke kiri sebagai parameter terakhir secara default yang akan mengisi pemanggilan fungsi. Semua sintaks pada dasarnya sama seperti fungsi panah biasa, kecuali arahnya berlawanan dan badan fungsi tidak memerlukan indentasi.
@@ -3506,15 +1802,6 @@ x <- f
3506print "hello" .. x 1802print "hello" .. x
3507``` 1803```
3508 1804
3509<YueDisplay>
3510
3511```yue
3512x <- f
3513print "hello" .. x
3514```
3515
3516</YueDisplay>
3517
3518Fungsi panah tebal juga tersedia. 1805Fungsi panah tebal juga tersedia.
3519 1806
3520```yuescript 1807```yuescript
@@ -3522,15 +1809,6 @@ Fungsi panah tebal juga tersedia.
3522print @value 1809print @value
3523``` 1810```
3524 1811
3525<YueDisplay>
3526
3527```yue
3528<= f
3529print @value
3530```
3531
3532</YueDisplay>
3533
3534Anda dapat menentukan placeholder untuk posisi fungsi backcall sebagai parameter. 1812Anda dapat menentukan placeholder untuk posisi fungsi backcall sebagai parameter.
3535 1813
3536```yuescript 1814```yuescript
@@ -3538,15 +1816,6 @@ Anda dapat menentukan placeholder untuk posisi fungsi backcall sebagai parameter
3538x * 2 1816x * 2
3539``` 1817```
3540 1818
3541<YueDisplay>
3542
3543```yue
3544(x) <- map _, [1, 2, 3]
3545x * 2
3546```
3547
3548</YueDisplay>
3549
3550Jika Anda ingin menulis kode lanjutan setelah backcall, Anda dapat memisahkannya dengan pernyataan `do`. Tanda kurung dapat dihilangkan untuk fungsi panah non-tebal. 1819Jika Anda ingin menulis kode lanjutan setelah backcall, Anda dapat memisahkannya dengan pernyataan `do`. Tanda kurung dapat dihilangkan untuk fungsi panah non-tebal.
3551 1820
3552```yuescript 1821```yuescript
@@ -3558,19 +1827,6 @@ result, msg = do
3558print result, msg 1827print result, msg
3559``` 1828```
3560 1829
3561<YueDisplay>
3562
3563```yue
3564result, msg = do
3565 data <- readAsync "filename.txt"
3566 print data
3567 info <- processAsync data
3568 check info
3569print result, msg
3570```
3571
3572</YueDisplay>
3573
3574# Literal Fungsi 1830# Literal Fungsi
3575 1831
3576Semua fungsi dibuat menggunakan ekspresi fungsi. Fungsi sederhana ditandai dengan panah: **->**. 1832Semua fungsi dibuat menggunakan ekspresi fungsi. Fungsi sederhana ditandai dengan panah: **->**.
@@ -3580,15 +1836,6 @@ my_function = ->
3580my_function() -- memanggil fungsi kosong 1836my_function() -- memanggil fungsi kosong
3581``` 1837```
3582 1838
3583<YueDisplay>
3584
3585```yue
3586my_function = ->
3587my_function() -- memanggil fungsi kosong
3588```
3589
3590</YueDisplay>
3591
3592Badan fungsi bisa berupa satu pernyataan yang ditulis langsung setelah panah, atau berupa serangkaian pernyataan yang diindentasi di baris berikutnya: 1839Badan fungsi bisa berupa satu pernyataan yang ditulis langsung setelah panah, atau berupa serangkaian pernyataan yang diindentasi di baris berikutnya:
3593 1840
3594```yuescript 1841```yuescript
@@ -3599,18 +1846,6 @@ func_b = ->
3599 print "The value:", value 1846 print "The value:", value
3600``` 1847```
3601 1848
3602<YueDisplay>
3603
3604```yue
3605func_a = -> print "hello world"
3606
3607func_b = ->
3608 value = 100
3609 print "The value:", value
3610```
3611
3612</YueDisplay>
3613
3614Jika fungsi tidak memiliki argumen, ia dapat dipanggil menggunakan operator `!`, sebagai ganti tanda kurung kosong. Pemanggilan `!` adalah cara yang disarankan untuk memanggil fungsi tanpa argumen. 1849Jika fungsi tidak memiliki argumen, ia dapat dipanggil menggunakan operator `!`, sebagai ganti tanda kurung kosong. Pemanggilan `!` adalah cara yang disarankan untuk memanggil fungsi tanpa argumen.
3615 1850
3616```yuescript 1851```yuescript
@@ -3618,29 +1853,12 @@ func_a!
3618func_b() 1853func_b()
3619``` 1854```
3620 1855
3621<YueDisplay>
3622
3623```yue
3624func_a!
3625func_b()
3626```
3627
3628</YueDisplay>
3629
3630Fungsi dengan argumen dapat dibuat dengan menaruh daftar nama argumen dalam tanda kurung sebelum panah: 1856Fungsi dengan argumen dapat dibuat dengan menaruh daftar nama argumen dalam tanda kurung sebelum panah:
3631 1857
3632```yuescript 1858```yuescript
3633sum = (x, y) -> print "sum", x + y 1859sum = (x, y) -> print "sum", x + y
3634``` 1860```
3635 1861
3636<YueDisplay>
3637
3638```yue
3639sum = (x, y) -> print "sum", x + y
3640```
3641
3642</YueDisplay>
3643
3644Fungsi dapat dipanggil dengan menuliskan argumen setelah nama ekspresi yang mengevaluasi ke fungsi. Saat merangkai pemanggilan fungsi, argumen diterapkan ke fungsi terdekat di sebelah kiri. 1862Fungsi dapat dipanggil dengan menuliskan argumen setelah nama ekspresi yang mengevaluasi ke fungsi. Saat merangkai pemanggilan fungsi, argumen diterapkan ke fungsi terdekat di sebelah kiri.
3645 1863
3646```yuescript 1864```yuescript
@@ -3650,31 +1868,12 @@ print sum 10, 20
3650a b c "a", "b", "c" 1868a b c "a", "b", "c"
3651``` 1869```
3652 1870
3653<YueDisplay>
3654
3655```yue
3656sum 10, 20
3657print sum 10, 20
3658
3659a b c "a", "b", "c"
3660```
3661
3662</YueDisplay>
3663
3664Untuk menghindari ambiguitas saat memanggil fungsi, tanda kurung juga bisa digunakan untuk mengelilingi argumen. Ini diperlukan di sini agar argumen yang tepat dikirim ke fungsi yang tepat. 1871Untuk menghindari ambiguitas saat memanggil fungsi, tanda kurung juga bisa digunakan untuk mengelilingi argumen. Ini diperlukan di sini agar argumen yang tepat dikirim ke fungsi yang tepat.
3665 1872
3666```yuescript 1873```yuescript
3667print "x:", sum(10, 20), "y:", sum(30, 40) 1874print "x:", sum(10, 20), "y:", sum(30, 40)
3668``` 1875```
3669 1876
3670<YueDisplay>
3671
3672```yue
3673print "x:", sum(10, 20), "y:", sum(30, 40)
3674```
3675
3676</YueDisplay>
3677
3678Tidak boleh ada spasi antara tanda kurung buka dan nama fungsi. 1877Tidak boleh ada spasi antara tanda kurung buka dan nama fungsi.
3679 1878
3680Fungsi akan memaksa pernyataan terakhir di badannya menjadi pernyataan return, ini disebut return implisit: 1879Fungsi akan memaksa pernyataan terakhir di badannya menjadi pernyataan return, ini disebut return implisit:
@@ -3684,29 +1883,12 @@ sum = (x, y) -> x + y
3684print "The sum is ", sum 10, 20 1883print "The sum is ", sum 10, 20
3685``` 1884```
3686 1885
3687<YueDisplay>
3688
3689```yue
3690sum = (x, y) -> x + y
3691print "The sum is ", sum 10, 20
3692```
3693
3694</YueDisplay>
3695
3696Dan jika Anda perlu return secara eksplisit, Anda bisa menggunakan kata kunci `return`: 1886Dan jika Anda perlu return secara eksplisit, Anda bisa menggunakan kata kunci `return`:
3697 1887
3698```yuescript 1888```yuescript
3699sum = (x, y) -> return x + y 1889sum = (x, y) -> return x + y
3700``` 1890```
3701 1891
3702<YueDisplay>
3703
3704```yue
3705sum = (x, y) -> return x + y
3706```
3707
3708</YueDisplay>
3709
3710Seperti di Lua, fungsi dapat mengembalikan beberapa nilai. Pernyataan terakhir harus berupa daftar nilai yang dipisahkan koma: 1892Seperti di Lua, fungsi dapat mengembalikan beberapa nilai. Pernyataan terakhir harus berupa daftar nilai yang dipisahkan koma:
3711 1893
3712```yuescript 1894```yuescript
@@ -3714,15 +1896,6 @@ mystery = (x, y) -> x + y, x - y
3714a, b = mystery 10, 20 1896a, b = mystery 10, 20
3715``` 1897```
3716 1898
3717<YueDisplay>
3718
3719```yue
3720mystery = (x, y) -> x + y, x - y
3721a, b = mystery 10, 20
3722```
3723
3724</YueDisplay>
3725
3726## Panah Tebal 1899## Panah Tebal
3727 1900
3728Karena sudah menjadi idiom di Lua untuk mengirim objek sebagai argumen pertama saat memanggil method, disediakan sintaks khusus untuk membuat fungsi yang otomatis menyertakan argumen `self`. 1901Karena sudah menjadi idiom di Lua untuk mengirim objek sebagai argumen pertama saat memanggil method, disediakan sintaks khusus untuk membuat fungsi yang otomatis menyertakan argumen `self`.
@@ -3731,14 +1904,6 @@ Karena sudah menjadi idiom di Lua untuk mengirim objek sebagai argumen pertama s
3731func = (num) => @value + num 1904func = (num) => @value + num
3732``` 1905```
3733 1906
3734<YueDisplay>
3735
3736```yue
3737func = (num) => @value + num
3738```
3739
3740</YueDisplay>
3741
3742## Nilai Default Argumen 1907## Nilai Default Argumen
3743 1908
3744Dimungkinkan untuk menyediakan nilai default bagi argumen fungsi. Argumen dianggap kosong jika nilainya nil. Argumen nil yang memiliki nilai default akan diganti sebelum badan fungsi dijalankan. 1909Dimungkinkan untuk menyediakan nilai default bagi argumen fungsi. Argumen dianggap kosong jika nilainya nil. Argumen nil yang memiliki nilai default akan diganti sebelum badan fungsi dijalankan.
@@ -3749,16 +1914,6 @@ my_function = (name = "something", height = 100) ->
3749 print "My height is", height 1914 print "My height is", height
3750``` 1915```
3751 1916
3752<YueDisplay>
3753
3754```yue
3755my_function = (name = "something", height = 100) ->
3756 print "Hello I am", name
3757 print "My height is", height
3758```
3759
3760</YueDisplay>
3761
3762Ekspresi nilai default argumen dievaluasi di dalam badan fungsi sesuai urutan deklarasi argumen. Karena itu, nilai default dapat mengakses argumen yang dideklarasikan sebelumnya. 1917Ekspresi nilai default argumen dievaluasi di dalam badan fungsi sesuai urutan deklarasi argumen. Karena itu, nilai default dapat mengakses argumen yang dideklarasikan sebelumnya.
3763 1918
3764```yuescript 1919```yuescript
@@ -3766,15 +1921,6 @@ some_args = (x = 100, y = x + 1000) ->
3766 print x + y 1921 print x + y
3767``` 1922```
3768 1923
3769<YueDisplay>
3770
3771```yue
3772some_args = (x = 100, y = x + 1000) ->
3773 print x + y
3774```
3775
3776</YueDisplay>
3777
3778## Pertimbangan 1924## Pertimbangan
3779 1925
3780Karena cara pemanggilan fungsi tanpa tanda kurung yang ekspresif, beberapa pembatasan harus diterapkan untuk menghindari ambiguitas parsing yang melibatkan spasi. 1926Karena cara pemanggilan fungsi tanpa tanda kurung yang ekspresif, beberapa pembatasan harus diterapkan untuk menghindari ambiguitas parsing yang melibatkan spasi.
@@ -3788,17 +1934,6 @@ c = x -y
3788d = x- z 1934d = x- z
3789``` 1935```
3790 1936
3791<YueDisplay>
3792
3793```yue
3794a = x - 10
3795b = x-10
3796c = x -y
3797d = x- z
3798```
3799
3800</YueDisplay>
3801
3802Prioritas argumen pertama pada pemanggilan fungsi dapat dikendalikan menggunakan spasi jika argumennya adalah literal string. Di Lua, sudah umum untuk menghilangkan tanda kurung saat memanggil fungsi dengan satu literal string atau tabel. 1937Prioritas argumen pertama pada pemanggilan fungsi dapat dikendalikan menggunakan spasi jika argumennya adalah literal string. Di Lua, sudah umum untuk menghilangkan tanda kurung saat memanggil fungsi dengan satu literal string atau tabel.
3803 1938
3804Ketika tidak ada spasi antara variabel dan literal string, pemanggilan fungsi akan memiliki prioritas atas ekspresi yang mengikuti. Tidak ada argumen lain yang dapat diberikan pada fungsi ketika dipanggil dengan cara ini. 1939Ketika tidak ada spasi antara variabel dan literal string, pemanggilan fungsi akan memiliki prioritas atas ekspresi yang mengikuti. Tidak ada argumen lain yang dapat diberikan pada fungsi ketika dipanggil dengan cara ini.
@@ -3810,15 +1945,6 @@ x = func"hello" + 100
3810y = func "hello" + 100 1945y = func "hello" + 100
3811``` 1946```
3812 1947
3813<YueDisplay>
3814
3815```yue
3816x = func"hello" + 100
3817y = func "hello" + 100
3818```
3819
3820</YueDisplay>
3821
3822## Argumen Multi-baris 1948## Argumen Multi-baris
3823 1949
3824Saat memanggil fungsi yang menerima banyak argumen, akan lebih nyaman untuk memecah daftar argumen menjadi beberapa baris. Karena sifat bahasa yang peka terhadap spasi, perlu hati-hati saat memecah daftar argumen. 1950Saat memanggil fungsi yang menerima banyak argumen, akan lebih nyaman untuk memecah daftar argumen menjadi beberapa baris. Karena sifat bahasa yang peka terhadap spasi, perlu hati-hati saat memecah daftar argumen.
@@ -3835,20 +1961,6 @@ cool_func 1, 2,
3835 7, 8 1961 7, 8
3836``` 1962```
3837 1963
3838<YueDisplay>
3839
3840```yue
3841my_func 5, 4, 3,
3842 8, 9, 10
3843
3844cool_func 1, 2,
3845 3, 4,
3846 5, 6,
3847 7, 8
3848```
3849
3850</YueDisplay>
3851
3852Jenis pemanggilan ini dapat dinest. Tingkat indentasi digunakan untuk menentukan argumen milik fungsi yang mana. 1964Jenis pemanggilan ini dapat dinest. Tingkat indentasi digunakan untuk menentukan argumen milik fungsi yang mana.
3853 1965
3854```yuescript 1966```yuescript
@@ -3858,17 +1970,6 @@ my_func 5, 6, 7,
3858 5, 4 1970 5, 4
3859``` 1971```
3860 1972
3861<YueDisplay>
3862
3863```yue
3864my_func 5, 6, 7,
3865 6, another_func 6, 7, 8,
3866 9, 1, 2,
3867 5, 4
3868```
3869
3870</YueDisplay>
3871
3872Karena tabel juga menggunakan koma sebagai pemisah, sintaks indentasi ini membantu agar nilai menjadi bagian dari daftar argumen, bukan bagian dari tabel. 1973Karena tabel juga menggunakan koma sebagai pemisah, sintaks indentasi ini membantu agar nilai menjadi bagian dari daftar argumen, bukan bagian dari tabel.
3873 1974
3874```yuescript 1975```yuescript
@@ -3879,18 +1980,6 @@ x = [
3879] 1980]
3880``` 1981```
3881 1982
3882<YueDisplay>
3883
3884```yue
3885x = [
3886 1, 2, 3, 4, a_func 4, 5,
3887 5, 6,
3888 8, 9, 10
3889]
3890```
3891
3892</YueDisplay>
3893
3894Meskipun jarang, perhatikan bahwa kita bisa memberikan indentasi yang lebih dalam untuk argumen fungsi jika kita tahu akan menggunakan indentasi yang lebih dangkal di bagian selanjutnya. 1983Meskipun jarang, perhatikan bahwa kita bisa memberikan indentasi yang lebih dalam untuk argumen fungsi jika kita tahu akan menggunakan indentasi yang lebih dangkal di bagian selanjutnya.
3895 1984
3896```yuescript 1985```yuescript
@@ -3900,17 +1989,6 @@ y = [ my_func 1, 2, 3,
3900] 1989]
3901``` 1990```
3902 1991
3903<YueDisplay>
3904
3905```yue
3906y = [ my_func 1, 2, 3,
3907 4, 5,
3908 5, 6, 7
3909]
3910```
3911
3912</YueDisplay>
3913
3914Hal yang sama juga dapat dilakukan pada pernyataan tingkat blok lainnya seperti kondisional. Kita bisa menggunakan tingkat indentasi untuk menentukan nilai milik pernyataan apa: 1992Hal yang sama juga dapat dilakukan pada pernyataan tingkat blok lainnya seperti kondisional. Kita bisa menggunakan tingkat indentasi untuk menentukan nilai milik pernyataan apa:
3915 1993
3916```yuescript 1994```yuescript
@@ -3927,24 +2005,6 @@ if func 1, 2, 3,
3927 print "I am inside if" 2005 print "I am inside if"
3928``` 2006```
3929 2007
3930<YueDisplay>
3931
3932```yue
3933if func 1, 2, 3,
3934 "hello",
3935 "world"
3936 print "hello"
3937 print "I am inside if"
3938
3939if func 1, 2, 3,
3940 "hello",
3941 "world"
3942 print "hello"
3943 print "I am inside if"
3944```
3945
3946</YueDisplay>
3947
3948## Destrukturisasi Parameter 2008## Destrukturisasi Parameter
3949 2009
3950YueScript kini mendukung destrukturisasi parameter fungsi ketika argumen berupa objek. Dua bentuk destrukturisasi literal tabel tersedia: 2010YueScript kini mendukung destrukturisasi parameter fungsi ketika argumen berupa objek. Dua bentuk destrukturisasi literal tabel tersedia:
@@ -3966,23 +2026,6 @@ arg1 = {a: 0}
3966f2 arg1, arg2 2026f2 arg1, arg2
3967``` 2027```
3968 2028
3969<YueDisplay>
3970
3971```yue
3972f1 = (:a, :b, :c) ->
3973 print a, b, c
3974
3975f1 a: 1, b: "2", c: {}
3976
3977f2 = ({a: a1 = 123, :b = 'abc'}, c = {}) ->
3978print a1, b, c
3979
3980arg1 = {a: 0}
3981f2 arg1, arg2
3982```
3983
3984</YueDisplay>
3985
3986## Ekspresi Return Berawalan 2029## Ekspresi Return Berawalan
3987 2030
3988Saat bekerja dengan badan fungsi yang sangat bertingkat, menjaga keterbacaan dan konsistensi nilai return bisa terasa melelahkan. Untuk mengatasinya, YueScript memperkenalkan sintaks **Ekspresi Return Berawalan**. Bentuknya sebagai berikut: 2031Saat bekerja dengan badan fungsi yang sangat bertingkat, menjaga keterbacaan dan konsistensi nilai return bisa terasa melelahkan. Untuk mengatasinya, YueScript memperkenalkan sintaks **Ekspresi Return Berawalan**. Bentuknya sebagai berikut:
@@ -3996,19 +2039,6 @@ findFirstEven = (list): nil ->
3996 return sub 2039 return sub
3997``` 2040```
3998 2041
3999<YueDisplay>
4000
4001```yue
4002findFirstEven = (list): nil ->
4003 for item in *list
4004 if type(item) == "table"
4005 for sub in *item
4006 if sub % 2 == 0
4007 return sub
4008```
4009
4010</YueDisplay>
4011
4012Ini setara dengan: 2042Ini setara dengan:
4013 2043
4014```yuescript 2044```yuescript
@@ -4021,20 +2051,6 @@ findFirstEven = (list) ->
4021 nil 2051 nil
4022``` 2052```
4023 2053
4024<YueDisplay>
4025
4026```yue
4027findFirstEven = (list) ->
4028 for item in *list
4029 if type(item) == "table"
4030 for sub in *item
4031 if sub % 2 == 0
4032 return sub
4033 nil
4034```
4035
4036</YueDisplay>
4037
4038Satu-satunya perbedaan adalah Anda dapat memindahkan ekspresi return terakhir sebelum token `->` atau `=>` untuk menunjukkan nilai return implisit fungsi sebagai pernyataan terakhir. Dengan cara ini, bahkan pada fungsi dengan banyak loop bertingkat atau cabang kondisional, Anda tidak lagi perlu menulis ekspresi return di akhir badan fungsi, sehingga struktur logika menjadi lebih lurus dan mudah diikuti. 2054Satu-satunya perbedaan adalah Anda dapat memindahkan ekspresi return terakhir sebelum token `->` atau `=>` untuk menunjukkan nilai return implisit fungsi sebagai pernyataan terakhir. Dengan cara ini, bahkan pada fungsi dengan banyak loop bertingkat atau cabang kondisional, Anda tidak lagi perlu menulis ekspresi return di akhir badan fungsi, sehingga struktur logika menjadi lebih lurus dan mudah diikuti.
4039 2055
4040## Varargs Bernama 2056## Varargs Bernama
@@ -4063,32 +2079,6 @@ process = (...args) ->
4063process 1, nil, 3, nil, 5 2079process 1, nil, 3, nil, 5
4064``` 2080```
4065 2081
4066<YueDisplay>
4067
4068```yue
4069f = (...t) ->
4070 print "argument count:", t.n
4071 print "table length:", #t
4072 for i = 1, t.n
4073 print t[i]
4074
4075f 1, 2, 3
4076f "a", "b", "c", "d"
4077f!
4078
4079-- Menangani kasus dengan nilai nil
4080process = (...args) ->
4081 sum = 0
4082 for i = 1, args.n
4083 if args[i] != nil and type(args[i]) == "number"
4084 sum += args[i]
4085 sum
4086
4087process 1, nil, 3, nil, 5
4088```
4089
4090</YueDisplay>
4091
4092# Spasi Kosong 2082# Spasi Kosong
4093 2083
4094YueScript adalah bahasa yang peka terhadap spasi. Anda harus menulis beberapa blok kode dengan indentasi yang sama menggunakan spasi **' '** atau tab **'\t'** seperti badan fungsi, daftar nilai, dan beberapa blok kontrol. Ekspresi yang mengandung spasi berbeda dapat bermakna berbeda. Tab diperlakukan seperti 4 spasi, tetapi sebaiknya jangan mencampur penggunaan spasi dan tab. 2084YueScript adalah bahasa yang peka terhadap spasi. Anda harus menulis beberapa blok kode dengan indentasi yang sama menggunakan spasi **' '** atau tab **'\t'** seperti badan fungsi, daftar nilai, dan beberapa blok kontrol. Ekspresi yang mengandung spasi berbeda dapat bermakna berbeda. Tab diperlakukan seperti 4 spasi, tetapi sebaiknya jangan mencampur penggunaan spasi dan tab.
@@ -4101,14 +2091,6 @@ Sebuah pernyataan biasanya berakhir pada pergantian baris. Anda juga bisa memaka
4101a = 1; b = 2; print a + b 2091a = 1; b = 2; print a + b
4102``` 2092```
4103 2093
4104<YueDisplay>
4105
4106```yue
4107a = 1; b = 2; print a + b
4108```
4109
4110</YueDisplay>
4111
4112## Rantai Multibaris 2094## Rantai Multibaris
4113 2095
4114Anda bisa menulis pemanggilan fungsi berantai multi-baris dengan indentasi yang sama. 2096Anda bisa menulis pemanggilan fungsi berantai multi-baris dengan indentasi yang sama.
@@ -4122,19 +2104,6 @@ Rx.Observable
4122 \subscribe print 2104 \subscribe print
4123``` 2105```
4124 2106
4125<YueDisplay>
4126
4127```yue
4128Rx.Observable
4129 .fromRange 1, 8
4130 \filter (x) -> x % 2 == 0
4131 \concat Rx.Observable.of 'who do we appreciate'
4132 \map (value) -> value .. '!'
4133 \subscribe print
4134```
4135
4136</YueDisplay>
4137
4138# Komentar 2107# Komentar
4139 2108
4140```yuescript 2109```yuescript
@@ -4150,23 +2119,6 @@ Tidak masalah.
4150func --[[port]] 3000, --[[ip]] "192.168.1.1" 2119func --[[port]] 3000, --[[ip]] "192.168.1.1"
4151``` 2120```
4152 2121
4153<YueDisplay>
4154
4155```yue
4156-- Saya adalah komentar
4157
4158str = --[[
4159Ini komentar multi-baris.
4160Tidak masalah.
4161]] strA \ -- komentar 1
4162 .. strB \ -- komentar 2
4163 .. strC
4164
4165func --[[port]] 3000, --[[ip]] "192.168.1.1"
4166```
4167
4168</YueDisplay>
4169
4170# Atribut 2122# Atribut
4171 2123
4172Dukungan sintaks untuk atribut Lua 5.4. Anda juga masih bisa menggunakan deklarasi `const` dan `close` dan mendapatkan pemeriksaan konstanta serta callback berbatas-scope ketika menargetkan versi Lua di bawah 5.4. 2124Dukungan sintaks untuk atribut Lua 5.4. Anda juga masih bisa menggunakan deklarasi `const` dan `close` dan mendapatkan pemeriksaan konstanta serta callback berbatas-scope ketika menargetkan versi Lua di bawah 5.4.
@@ -4176,15 +2128,6 @@ const a = 123
4176close _ = <close>: -> print "Out of scope." 2128close _ = <close>: -> print "Out of scope."
4177``` 2129```
4178 2130
4179<YueDisplay>
4180
4181```yue
4182const a = 123
4183close _ = <close>: -> print "Out of scope."
4184```
4185
4186</YueDisplay>
4187
4188Anda dapat melakukan destrukturisasi dengan variabel yang diberi atribut sebagai konstanta. 2131Anda dapat melakukan destrukturisasi dengan variabel yang diberi atribut sebagai konstanta.
4189 2132
4190```yuescript 2133```yuescript
@@ -4192,15 +2135,6 @@ const {:a, :b, c, d} = tb
4192-- a = 1 2135-- a = 1
4193``` 2136```
4194 2137
4195<YueDisplay>
4196
4197```yue
4198const {:a, :b, c, d} = tb
4199-- a = 1
4200```
4201
4202</YueDisplay>
4203
4204Anda juga bisa mendeklarasikan variabel global sebagai `const`. 2138Anda juga bisa mendeklarasikan variabel global sebagai `const`.
4205 2139
4206```yuescript 2140```yuescript
@@ -4208,15 +2142,6 @@ global const Constant = 123
4208-- Constant = 1 2142-- Constant = 1
4209``` 2143```
4210 2144
4211<YueDisplay>
4212
4213```yue
4214global const Constant = 123
4215-- Constant = 1
4216```
4217
4218</YueDisplay>
4219
4220# Operator 2145# Operator
4221 2146
4222Semua operator biner dan unari Lua tersedia. Selain itu **!=** adalah alias untuk **~=**, dan **\\** atau **::** bisa digunakan untuk menulis pemanggilan fungsi berantai seperti `tb\func!` atau `tb::func!`. YueScript juga menawarkan beberapa operator khusus lain untuk menulis kode yang lebih ekspresif. 2147Semua operator biner dan unari Lua tersedia. Selain itu **!=** adalah alias untuk **~=**, dan **\\** atau **::** bisa digunakan untuk menulis pemanggilan fungsi berantai seperti `tb\func!` atau `tb::func!`. YueScript juga menawarkan beberapa operator khusus lain untuk menulis kode yang lebih ekspresif.
@@ -4226,15 +2151,6 @@ tb\func! if tb ~= nil
4226tb::func! if tb != nil 2151tb::func! if tb != nil
4227``` 2152```
4228 2153
4229<YueDisplay>
4230
4231```yue
4232tb\func! if tb ~= nil
4233tb::func! if tb != nil
4234```
4235
4236</YueDisplay>
4237
4238## Perbandingan Berantai 2154## Perbandingan Berantai
4239 2155
4240Perbandingan bisa dirantai secara bebas: 2156Perbandingan bisa dirantai secara bebas:
@@ -4248,19 +2164,6 @@ print 1 <= a <= 10
4248-- output: true 2164-- output: true
4249``` 2165```
4250 2166
4251<YueDisplay>
4252
4253```yue
4254print 1 < 2 <= 2 < 3 == 3 > 2 >= 1 == 1 < 3 != 5
4255-- output: true
4256
4257a = 5
4258print 1 <= a <= 10
4259-- output: true
4260```
4261
4262</YueDisplay>
4263
4264Perhatikan perilaku evaluasi perbandingan berantai: 2167Perhatikan perilaku evaluasi perbandingan berantai:
4265 2168
4266```yuescript 2169```yuescript
@@ -4286,33 +2189,6 @@ print v(1) > v(2) <= v(3)
4286]] 2189]]
4287``` 2190```
4288 2191
4289<YueDisplay>
4290
4291```yue
4292v = (x) ->
4293 print x
4294 x
4295
4296print v(1) < v(2) <= v(3)
4297--[[
4298 output:
4299 2
4300 1
4301 3
4302 true
4303]]
4304
4305print v(1) > v(2) <= v(3)
4306--[[
4307 output:
4308 2
4309 1
4310 false
4311]]
4312```
4313
4314</YueDisplay>
4315
4316Ekspresi tengah hanya dievaluasi sekali, bukan dua kali seperti jika ekspresi ditulis sebagai `v(1) < v(2) and v(2) <= v(3)`. Namun, urutan evaluasi pada perbandingan berantai tidak didefinisikan. Sangat disarankan untuk tidak menggunakan ekspresi dengan efek samping (seperti `print`) di perbandingan berantai. Jika efek samping diperlukan, operator short-circuit `and` sebaiknya digunakan secara eksplisit. 2192Ekspresi tengah hanya dievaluasi sekali, bukan dua kali seperti jika ekspresi ditulis sebagai `v(1) < v(2) and v(2) <= v(3)`. Namun, urutan evaluasi pada perbandingan berantai tidak didefinisikan. Sangat disarankan untuk tidak menggunakan ekspresi dengan efek samping (seperti `print`) di perbandingan berantai. Jika efek samping diperlukan, operator short-circuit `and` sebaiknya digunakan secara eksplisit.
4317 2193
4318## Menambahkan ke Tabel 2194## Menambahkan ke Tabel
@@ -4324,15 +2200,6 @@ tab = []
4324tab[] = "Value" 2200tab[] = "Value"
4325``` 2201```
4326 2202
4327<YueDisplay>
4328
4329```yue
4330tab = []
4331tab[] = "Value"
4332```
4333
4334</YueDisplay>
4335
4336Anda juga bisa memakai operator spread `...` untuk menambahkan semua elemen dari satu list ke list lain: 2203Anda juga bisa memakai operator spread `...` untuk menambahkan semua elemen dari satu list ke list lain:
4337 2204
4338```yuescript 2205```yuescript
@@ -4342,17 +2209,6 @@ tbA[] = ...tbB
4342-- tbA sekarang [1, 2, 3, 4, 5, 6] 2209-- tbA sekarang [1, 2, 3, 4, 5, 6]
4343``` 2210```
4344 2211
4345<YueDisplay>
4346
4347```yue
4348tbA = [1, 2, 3]
4349tbB = [4, 5, 6]
4350tbA[] = ...tbB
4351-- tbA sekarang [1, 2, 3, 4, 5, 6]
4352```
4353
4354</YueDisplay>
4355
4356## Penyebaran Tabel 2212## Penyebaran Tabel
4357 2213
4358Anda bisa menggabungkan tabel array atau tabel hash menggunakan operator spread `...` sebelum ekspresi di literal tabel. 2214Anda bisa menggabungkan tabel array atau tabel hash menggunakan operator spread `...` sebelum ekspresi di literal tabel.
@@ -4374,27 +2230,6 @@ b = {4, 5, y: 1}
4374merge = {...a, ...b} 2230merge = {...a, ...b}
4375``` 2231```
4376 2232
4377<YueDisplay>
4378
4379```yue
4380parts =
4381 * "shoulders"
4382 * "knees"
4383lyrics =
4384 * "head"
4385 * ...parts
4386 * "and"
4387 * "toes"
4388
4389copy = {...other}
4390
4391a = {1, 2, 3, x: 1}
4392b = {4, 5, y: 1}
4393merge = {...a, ...b}
4394```
4395
4396</YueDisplay>
4397
4398## Indeks Balik Tabel 2233## Indeks Balik Tabel
4399 2234
4400Anda dapat menggunakan operator **#** untuk mendapatkan elemen terakhir dari tabel. 2235Anda dapat menggunakan operator **#** untuk mendapatkan elemen terakhir dari tabel.
@@ -4405,16 +2240,6 @@ second_last = data.items[#-1]
4405data.items[#] = 1 2240data.items[#] = 1
4406``` 2241```
4407 2242
4408<YueDisplay>
4409
4410```yue
4411last = data.items[#]
4412second_last = data.items[#-1]
4413data.items[#] = 1
4414```
4415
4416</YueDisplay>
4417
4418## Metatable 2243## Metatable
4419 2244
4420Operator **<>** dapat digunakan sebagai pintasan untuk manipulasi metatable. 2245Operator **<>** dapat digunakan sebagai pintasan untuk manipulasi metatable.
@@ -4439,26 +2264,6 @@ print d.value
4439close _ = <close>: -> print "out of scope" 2264close _ = <close>: -> print "out of scope"
4440``` 2265```
4441 2266
4442<YueDisplay>
4443
4444```yue
4445mt = {}
4446add = (right) => <>: mt, value: @value + right.value
4447mt.__add = add
4448
4449a = <>: mt, value: 1
4450 -- set field dengan variabel bernama sama
4451b = :<add>, value: 2
4452c = <add>: mt.__add, value: 3
4453
4454d = a + b + c
4455print d.value
4456
4457close _ = <close>: -> print "out of scope"
4458```
4459
4460</YueDisplay>
4461
4462### Mengakses Metatable 2267### Mengakses Metatable
4463 2268
4464Akses metatable dengan **<>**, nama metamethod yang dikelilingi **<>**, atau menulis ekspresi di dalam **<>**. 2269Akses metatable dengan **<>**, nama metamethod yang dikelilingi **<>**, atau menulis ekspresi di dalam **<>**.
@@ -4473,19 +2278,6 @@ tb.<> = __index: {item: "hello"}
4473print tb.item 2278print tb.item
4474``` 2279```
4475 2280
4476<YueDisplay>
4477
4478```yue
4479-- dibuat dengan metatable yang berisi field "value"
4480tb = <"value">: 123
4481tb.<index> = tb.<>
4482print tb.value
4483tb.<> = __index: {item: "hello"}
4484print tb.item
4485```
4486
4487</YueDisplay>
4488
4489### Destrukturisasi Metatable 2281### Destrukturisasi Metatable
4490 2282
4491Destrukturisasi metatable dengan kunci metamethod yang dikelilingi **<>**. 2283Destrukturisasi metatable dengan kunci metamethod yang dikelilingi **<>**.
@@ -4495,15 +2287,6 @@ Destrukturisasi metatable dengan kunci metamethod yang dikelilingi **<>**.
4495print item, new, close, getter 2287print item, new, close, getter
4496``` 2288```
4497 2289
4498<YueDisplay>
4499
4500```yue
4501{item, :new, :<close>, <index>: getter} = tb
4502print item, new, close, getter
4503```
4504
4505</YueDisplay>
4506
4507## Keberadaan 2290## Keberadaan
4508 2291
4509Operator **?** dapat digunakan dalam berbagai konteks untuk memeriksa keberadaan. 2292Operator **?** dapat digunakan dalam berbagai konteks untuk memeriksa keberadaan.
@@ -4523,25 +2306,6 @@ with? io.open "test.txt", "w"
4523 \close! 2306 \close!
4524``` 2307```
4525 2308
4526<YueDisplay>
4527
4528```yue
4529func?!
4530print abc?["hello world"]?.xyz
4531
4532x = tab?.value
4533len = utf8?.len or string?.len or (o) -> #o
4534
4535if print and x?
4536 print x
4537
4538with? io.open "test.txt", "w"
4539 \write "hello"
4540 \close!
4541```
4542
4543</YueDisplay>
4544
4545## Piping 2309## Piping
4546 2310
4547Sebagai ganti serangkaian pemanggilan fungsi bersarang, Anda bisa mengalirkan nilai dengan operator **|>**. 2311Sebagai ganti serangkaian pemanggilan fungsi bersarang, Anda bisa mengalirkan nilai dengan operator **|>**.
@@ -4560,24 +2324,6 @@ readFile "example.txt"
4560 |> print 2324 |> print
4561``` 2325```
4562 2326
4563<YueDisplay>
4564
4565```yue
4566"hello" |> print
45671 |> print 2 -- sisipkan nilai pipe sebagai argumen pertama
45682 |> print 1, _, 3 -- pipe dengan placeholder
4569
4570-- ekspresi pipe multi-baris
4571readFile "example.txt"
4572 |> extract language, {}
4573 |> parse language
4574 |> emit
4575 |> render
4576 |> print
4577```
4578
4579</YueDisplay>
4580
4581## Nil Coalescing 2327## Nil Coalescing
4582 2328
4583Operator nil-coalescing **??** mengembalikan nilai dari operan kiri jika bukan **nil**; jika tidak, operator mengevaluasi operan kanan dan mengembalikan hasilnya. Operator **??** tidak mengevaluasi operan kanan jika operan kiri bernilai non-nil. 2329Operator nil-coalescing **??** mengembalikan nilai dari operan kiri jika bukan **nil**; jika tidak, operator mengevaluasi operan kanan dan mengembalikan hasilnya. Operator **??** tidak mengevaluasi operan kanan jika operan kiri bernilai non-nil.
@@ -4590,17 +2336,6 @@ func a ?? {}
4590a ??= false 2336a ??= false
4591``` 2337```
4592 2338
4593<YueDisplay>
4594
4595```yue
4596local a, b, c, d
4597a = b ?? c ?? d
4598func a ?? {}
4599a ??= false
4600```
4601
4602</YueDisplay>
4603
4604## Objek Implisit 2339## Objek Implisit
4605 2340
4606Anda dapat menulis daftar struktur implisit yang diawali simbol **\*** atau **-** di dalam blok tabel. Jika Anda membuat objek implisit, field objek harus berada pada indentasi yang sama. 2341Anda dapat menulis daftar struktur implisit yang diawali simbol **\*** atau **-** di dalam blok tabel. Jika Anda membuat objek implisit, field objek harus berada pada indentasi yang sama.
@@ -4648,52 +2383,6 @@ tb =
4648 2383
4649``` 2384```
4650 2385
4651<YueDisplay>
4652
4653```yue
4654-- assignment dengan objek implisit
4655list =
4656 * 1
4657 * 2
4658 * 3
4659
4660-- pemanggilan fungsi dengan objek implisit
4661func
4662 * 1
4663 * 2
4664 * 3
4665
4666-- return dengan objek implisit
4667f = ->
4668 return
4669 * 1
4670 * 2
4671 * 3
4672
4673-- tabel dengan objek implisit
4674tb =
4675 name: "abc"
4676
4677 values:
4678 - "a"
4679 - "b"
4680 - "c"
4681
4682 objects:
4683 - name: "a"
4684 value: 1
4685 func: => @value + 1
4686 tb:
4687 fieldA: 1
4688
4689 - name: "b"
4690 value: 2
4691 func: => @value + 2
4692 tb: { }
4693```
4694
4695</YueDisplay>
4696
4697# Literal 2386# Literal
4698 2387
4699Semua literal primitif di Lua dapat digunakan. Ini berlaku untuk angka, string, boolean, dan **nil**. 2388Semua literal primitif di Lua dapat digunakan. Ini berlaku untuk angka, string, boolean, dan **nil**.
@@ -4709,19 +2398,6 @@ some_string = "Here is a string
4709print "I am #{math.random! * 100}% sure." 2398print "I am #{math.random! * 100}% sure."
4710``` 2399```
4711 2400
4712<YueDisplay>
4713
4714```yue
4715some_string = "Here is a string
4716 that has a line break in it."
4717
4718-- Anda dapat mencampur ekspresi ke dalam literal string dengan sintaks #{}.
4719-- Interpolasi string hanya tersedia pada string dengan tanda kutip ganda.
4720print "I am #{math.random! * 100}% sure."
4721```
4722
4723</YueDisplay>
4724
4725## Literal Angka 2401## Literal Angka
4726 2402
4727Anda bisa menggunakan garis bawah pada literal angka untuk meningkatkan keterbacaan. 2403Anda bisa menggunakan garis bawah pada literal angka untuk meningkatkan keterbacaan.
@@ -4732,16 +2408,6 @@ hex = 0xEF_BB_BF
4732binary = 0B10011 2408binary = 0B10011
4733``` 2409```
4734 2410
4735<YueDisplay>
4736
4737```yue
4738integer = 1_000_000
4739hex = 0xEF_BB_BF
4740binary = 0B10011
4741```
4742
4743</YueDisplay>
4744
4745## String Multibaris YAML 2411## String Multibaris YAML
4746 2412
4747Prefiks `|` memperkenalkan literal string multibaris bergaya YAML: 2413Prefiks `|` memperkenalkan literal string multibaris bergaya YAML:
@@ -4754,18 +2420,6 @@ str = |
4754 - #{expr} 2420 - #{expr}
4755``` 2421```
4756 2422
4757<YueDisplay>
4758
4759```yue
4760str = |
4761 key: value
4762 list:
4763 - item1
4764 - #{expr}
4765```
4766
4767</YueDisplay>
4768
4769Ini memungkinkan penulisan teks multibaris terstruktur dengan mudah. Semua pemisah baris dan indentasi dipertahankan relatif terhadap baris non-kosong pertama, dan ekspresi di dalam `#{...}` diinterpolasi otomatis sebagai `tostring(expr)`. 2423Ini memungkinkan penulisan teks multibaris terstruktur dengan mudah. Semua pemisah baris dan indentasi dipertahankan relatif terhadap baris non-kosong pertama, dan ekspresi di dalam `#{...}` diinterpolasi otomatis sebagai `tostring(expr)`.
4770 2424
4771String Multibaris YAML secara otomatis mendeteksi prefiks spasi awal yang sama (indentasi minimum di seluruh baris non-kosong) dan menghapusnya dari semua baris. Ini memudahkan untuk mengindentasi kode secara visual tanpa memengaruhi isi string yang dihasilkan. 2425String Multibaris YAML secara otomatis mendeteksi prefiks spasi awal yang sama (indentasi minimum di seluruh baris non-kosong) dan menghapusnya dari semua baris. Ini memudahkan untuk mengindentasi kode secara visual tanpa memengaruhi isi string yang dihasilkan.
@@ -4778,18 +2432,6 @@ fn = ->
4778 return str 2432 return str
4779``` 2433```
4780 2434
4781<YueDisplay>
4782
4783```yue
4784fn = ->
4785 str = |
4786 foo:
4787 bar: baz
4788 return str
4789```
4790
4791</YueDisplay>
4792
4793Indentasi internal dipertahankan relatif terhadap prefiks umum yang dihapus, sehingga struktur bertingkat tetap rapi. 2435Indentasi internal dipertahankan relatif terhadap prefiks umum yang dihapus, sehingga struktur bertingkat tetap rapi.
4794 2436
4795Semua karakter khusus seperti tanda kutip (`"`) dan backslash (`\`) di dalam blok YAMLMultiline di-escape secara otomatis agar string Lua yang dihasilkan valid secara sintaks dan berperilaku sebagaimana mestinya. 2437Semua karakter khusus seperti tanda kutip (`"`) dan backslash (`\`) di dalam blok YAMLMultiline di-escape secara otomatis agar string Lua yang dihasilkan valid secara sintaks dan berperilaku sebagaimana mestinya.
@@ -4800,16 +2442,6 @@ str = |
4800 note: 'He said: "#{Hello}!"' 2442 note: 'He said: "#{Hello}!"'
4801``` 2443```
4802 2444
4803<YueDisplay>
4804
4805```yue
4806str = |
4807 path: "C:\Program Files\App"
4808 note: 'He said: "#{Hello}!"'
4809```
4810
4811</YueDisplay>
4812
4813# Modul 2445# Modul
4814 2446
4815## Import 2447## Import
@@ -4841,35 +2473,6 @@ do
4841 import "export" as {one, two, Something:{umm:{ch}}} 2473 import "export" as {one, two, Something:{umm:{ch}}}
4842``` 2474```
4843 2475
4844<YueDisplay>
4845
4846```yue
4847-- digunakan sebagai destrukturisasi tabel
4848do
4849 import insert, concat from table
4850 -- akan error saat meng-assign ke insert, concat
4851 import C, Ct, Cmt from require "lpeg"
4852 -- shortcut untuk require implisit
4853 import x, y, z from 'mymodule'
4854 -- import gaya Python
4855 from 'module' import a, b, c
4856
4857-- shortcut untuk require modul
4858do
4859 import 'module'
4860 import 'module_x'
4861 import "d-a-s-h-e-s"
4862 import "module.part"
4863
4864-- require modul dengan aliasing atau destrukturisasi tabel
4865do
4866 import "player" as PlayerModule
4867 import "lpeg" as :C, :Ct, :Cmt
4868 import "export" as {one, two, Something:{umm:{ch}}}
4869```
4870
4871</YueDisplay>
4872
4873## Import Global 2476## Import Global
4874 2477
4875Anda dapat mengimpor global tertentu ke variabel local dengan `import`. Saat mengimpor rangkaian akses variabel global, field terakhir akan di-assign ke variabel local. 2478Anda dapat mengimpor global tertentu ke variabel local dengan `import`. Saat mengimpor rangkaian akses variabel global, field terakhir akan di-assign ke variabel local.
@@ -4881,17 +2484,6 @@ do
4881 print concat ["a", tostring 1] 2484 print concat ["a", tostring 1]
4882``` 2485```
4883 2486
4884<YueDisplay>
4885
4886```yue
4887do
4888 import tostring
4889 import table.concat
4890 print concat ["a", tostring 1]
4891```
4892
4893</YueDisplay>
4894
4895### Import Variabel Global Otomatis 2487### Import Variabel Global Otomatis
4896 2488
4897Anda dapat menempatkan `import global` di awal blok untuk mengimpor secara otomatis semua nama yang belum dideklarasikan atau di-assign secara eksplisit di scope saat ini sebagai global. Import implisit ini diperlakukan sebagai local const yang mereferensikan global terkait pada posisi pernyataan tersebut. 2489Anda dapat menempatkan `import global` di awal blok untuk mengimpor secara otomatis semua nama yang belum dideklarasikan atau di-assign secara eksplisit di scope saat ini sebagai global. Import implisit ini diperlakukan sebagai local const yang mereferensikan global terkait pada posisi pernyataan tersebut.
@@ -4913,25 +2505,6 @@ do
4913 FLAG = 123 2505 FLAG = 123
4914``` 2506```
4915 2507
4916<YueDisplay>
4917
4918```yue
4919do
4920 import global
4921 print "hello"
4922 math.random 3
4923 -- print = nil -- error: imported globals are const
4924
4925do
4926 -- variabel global eksplisit tidak akan diimpor
4927 import global
4928 global FLAG
4929 print FLAG
4930 FLAG = 123
4931```
4932
4933</YueDisplay>
4934
4935## Export 2508## Export
4936 2509
4937Pernyataan `export` menawarkan cara ringkas untuk mendefinisikan modul. 2510Pernyataan `export` menawarkan cara ringkas untuk mendefinisikan modul.
@@ -4956,26 +2529,6 @@ export class Something
4956 umm: "cool" 2529 umm: "cool"
4957``` 2530```
4958 2531
4959<YueDisplay>
4960
4961```yue
4962export a, b, c = 1, 2, 3
4963export cool = "cat"
4964
4965export What = if this
4966 "abc"
4967else
4968 "def"
4969
4970export y = ->
4971 hallo = 3434
4972
4973export class Something
4974 umm: "cool"
4975```
4976
4977</YueDisplay>
4978
4979Melakukan export bernama dengan destrukturisasi. 2532Melakukan export bernama dengan destrukturisasi.
4980 2533
4981```yuescript 2534```yuescript
@@ -4983,15 +2536,6 @@ export :loadstring, to_lua: tolua = yue
4983export {itemA: {:fieldA = 'default'}} = tb 2536export {itemA: {:fieldA = 'default'}} = tb
4984``` 2537```
4985 2538
4986<YueDisplay>
4987
4988```yue
4989export :loadstring, to_lua: tolua = yue
4990export {itemA: {:fieldA = 'default'}} = tb
4991```
4992
4993</YueDisplay>
4994
4995Export item bernama dari modul tanpa membuat variabel local. 2539Export item bernama dari modul tanpa membuat variabel local.
4996 2540
4997```yuescript 2541```yuescript
@@ -5000,16 +2544,6 @@ export.<index> = items
5000export["a-b-c"] = 123 2544export["a-b-c"] = 123
5001``` 2545```
5002 2546
5003<YueDisplay>
5004
5005```yue
5006export.itemA = tb
5007export.<index> = items
5008export["a-b-c"] = 123
5009```
5010
5011</YueDisplay>
5012
5013### Export Tanpa Nama 2547### Export Tanpa Nama
5014 2548
5015Export tanpa nama akan menambahkan item target ke bagian array dari tabel export. 2549Export tanpa nama akan menambahkan item target ke bagian array dari tabel export.
@@ -5027,23 +2561,6 @@ export with tmp
5027 j = 2000 2561 j = 2000
5028``` 2562```
5029 2563
5030<YueDisplay>
5031
5032```yue
5033d, e, f = 3, 2, 1
5034export d, e, f
5035
5036export if this
5037 123
5038else
5039 456
5040
5041export with tmp
5042 j = 2000
5043```
5044
5045</YueDisplay>
5046
5047### Export Default 2564### Export Default
5048 2565
5049Gunakan kata kunci **default** dalam pernyataan export untuk mengganti tabel export dengan apa pun. 2566Gunakan kata kunci **default** dalam pernyataan export untuk mengganti tabel export dengan apa pun.
@@ -5054,16 +2571,6 @@ export default ->
5054 123 2571 123
5055``` 2572```
5056 2573
5057<YueDisplay>
5058
5059```yue
5060export default ->
5061 print "hello"
5062 123
5063```
5064
5065</YueDisplay>
5066
5067# Lisensi: MIT 2574# Lisensi: MIT
5068 2575
5069Copyright (c) 2017-2026 Li Jin <dragon-fly@qq.com> 2576Copyright (c) 2017-2026 Li Jin <dragon-fly@qq.com>