summaryrefslogtreecommitdiff
path: root/doc/yue-de.md
diff options
context:
space:
mode:
Diffstat (limited to 'doc/yue-de.md')
-rw-r--r--doc/yue-de.md2497
1 files changed, 2 insertions, 2495 deletions
diff --git a/doc/yue-de.md b/doc/yue-de.md
index 1a13a47..94bfd4b 100644
--- a/doc/yue-de.md
+++ b/doc/yue-de.md
@@ -1,11 +1,5 @@
1---
2title: Referenz
3---
4
5# YueScript-Dokumentation 1# YueScript-Dokumentation
6 2
7<img src="/image/yuescript.svg" width="250px" height="250px" alt="logo" style="padding-top: 3em; padding-bottom: 2em;"/>
8
9Willkommen in der offiziellen <b>YueScript</b>-Dokumentation!<br/> 3Willkommen in der offiziellen <b>YueScript</b>-Dokumentation!<br/>
10Hier findest du Sprachfeatures, Nutzung, Referenzbeispiele und Ressourcen.<br/> 4Hier findest du Sprachfeatures, Nutzung, Referenzbeispiele und Ressourcen.<br/>
11Bitte wähle ein Kapitel in der Seitenleiste, um mit YueScript zu beginnen. 5Bitte wähle ein Kapitel in der Seitenleiste, um mit YueScript zu beginnen.
@@ -21,17 +15,6 @@ do
21print var -- nil hier 15print var -- nil hier
22``` 16```
23 17
24<YueDisplay>
25
26```yue
27do
28 var = "hallo"
29 print var
30print var -- nil hier
31```
32
33</YueDisplay>
34
35YueScripts **do** kann auch als Ausdruck verwendet werden. So kannst du mehrere Zeilen in einem Ausdruck kombinieren. Das Ergebnis des `do`-Ausdrucks ist die letzte Anweisung im Block. `do`-Ausdrücke unterstützen die Verwendung von `break`, um den Kontrollfluss zu unterbrechen und mehrere Rückgabewerte vorzeitig zurückzugeben. 18YueScripts **do** kann auch als Ausdruck verwendet werden. So kannst du mehrere Zeilen in einem Ausdruck kombinieren. Das Ergebnis des `do`-Ausdrucks ist die letzte Anweisung im Block. `do`-Ausdrücke unterstützen die Verwendung von `break`, um den Kontrollfluss zu unterbrechen und mehrere Rückgabewerte vorzeitig zurückzugeben.
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 "Schlüssel wird zugewiesen!"
97 1234
98}
99```
100
101</YueDisplay>
102
103# Line-Decorators 47# Line-Decorators
104 48
105Zur Vereinfachung können `for`-Schleifen und `if`-Anweisungen auf einzelne Anweisungen am Zeilenende angewendet werden: 49Zur Vereinfachung können `for`-Schleifen und `if`-Anweisungen auf einzelne Anweisungen am Zeilenende angewendet werden:
@@ -108,28 +52,12 @@ Zur Vereinfachung können `for`-Schleifen und `if`-Anweisungen auf einzelne Anwe
108print "Hallo Welt" if name == "Rob" 52print "Hallo Welt" if name == "Rob"
109``` 53```
110 54
111<YueDisplay>
112
113```yue
114print "Hallo Welt" if name == "Rob"
115```
116
117</YueDisplay>
118
119Und mit einfachen Schleifen: 55Und mit einfachen Schleifen:
120 56
121```yuescript 57```yuescript
122print "Element: ", item for item in *items 58print "Element: ", item for item in *items
123``` 59```
124 60
125<YueDisplay>
126
127```yue
128print "Element: ", item for item in *items
129```
130
131</YueDisplay>
132
133Und mit `while`-Schleifen: 61Und mit `while`-Schleifen:
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# Makros 69# Makros
152 70
153## Häufige Verwendung 71## Häufige Verwendung
@@ -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 = -> "'Hallo Welt'"
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-- übergebene Ausdrücke werden als Strings behandelt
212macro and = (...) -> "#{ table.concat {...}, ' and ' }"
213if $and f1!, f2!, f3!
214 print "OK"
215```
216
217</YueDisplay>
218
219## Rohcode einfügen 104## Rohcode einfügen
220 105
221Eine Makrofunktion kann entweder einen YueScript-String oder eine Konfigurationstabelle mit Lua-Code zurückgeben. 106Eine Makrofunktion kann entweder einen YueScript-String oder eine Konfigurationstabelle mit Lua-Code zurückgeben.
@@ -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 = -> "Zuweisung an die vom Yue-Makro definierte Variable schlägt fehl"
255
256macro luaFunc = (var) -> {
257 code: "local function #{var}() end"
258 type: "lua"
259}
260$luaFunc funcB
261funcB = -> "Zuweisung an die vom Lua-Makro definierte Variable schlägt fehl"
262
263macro lua = (code) -> {
264 :code
265 type: "lua"
266}
267
268-- führende und abschließende Symbole des Raw-Strings werden automatisch getrimmt
269$lua[==[
270-- Einfügen von rohem Lua-Code
271if cond then
272 print("Ausgabe")
273end
274]==]
275```
276
277</YueDisplay>
278
279## Makros exportieren 134## Makros exportieren
280 135
281Makrofunktionen können aus einem Modul exportiert und in ein anderes Modul importiert werden. Exportierte Makros müssen in einer einzelnen Datei liegen, und im Export-Modul dürfen nur Makrodefinitionen, Makro-Imports und Makro-Expansionen stehen. 136Makrofunktionen können aus einem Modul exportiert und in ein anderes Modul importiert werden. Exportierte Makros müssen in einer einzelnen Datei liegen, und im Export-Modul dürfen nur Makrodefinitionen, Makro-Imports und Makro-Expansionen stehen.
@@ -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-- Datei: 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-- Datei main.yue
308-- Import-Funktion im Browser nicht verfügbar, in echter Umgebung testen
309--[[
310import "utils" as {
311 $, -- Symbol zum Importieren aller Makros
312 $foreach: $each -- Makro $foreach in $each umbenennen
313}
314[1, 2, 3] |> $map(_ * 2) |> $filter(_ > 4) |> $each print _
315]]
316```
317
318</YueDisplay>
319
320## Eingebaute Makros 153## Eingebaute Makros
321 154
322Es gibt einige eingebaute Makros, aber du kannst sie überschreiben, indem du Makros mit denselben Namen deklarierst. 155Es gibt einige eingebaute Makros, aber du kannst sie überschreiben, indem du Makros mit denselben Namen deklarierst.
@@ -326,15 +159,6 @@ print $FILE -- String des aktuellen Modulnamens
326print $LINE -- gibt 2 aus 159print $LINE -- gibt 2 aus
327``` 160```
328 161
329<YueDisplay>
330
331```yue
332print $FILE -- String des aktuellen Modulnamens
333print $LINE -- gibt 2 aus
334```
335
336</YueDisplay>
337
338## Makros mit Makros erzeugen 162## Makros mit Makros erzeugen
339 163
340In YueScript erlauben Makrofunktionen Codegenerierung zur Compile-Zeit. Durch das Verschachteln von Makrofunktionen kannst du komplexere Generierungsmuster erzeugen. Damit kannst du eine Makrofunktion definieren, die eine andere Makrofunktion erzeugt. 164In YueScript erlauben Makrofunktionen Codegenerierung zur Compile-Zeit. Durch das Verschachteln von Makrofunktionen kannst du komplexere Generierungsmuster erzeugen. Damit kannst du eine Makrofunktion definieren, die eine andere Makrofunktion erzeugt.
@@ -357,28 +181,6 @@ print "Gültiger Enum-Typ:", $BodyType Static
357-- print "Kompilierungsfehler bei Enum-Typ:", $BodyType Unknown 181-- print "Kompilierungsfehler bei Enum-Typ:", $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 "erhalten: \"#{item}\", erwartet eines von #{table.concat items, ', '}" unless itemSet[item]
368 "\"#{item}\""
369
370macro BodyType = $Enum(
371 Static
372 Dynamic
373 Kinematic
374)
375
376print "Gültiger Enum-Typ:", $BodyType Static
377-- print "Kompilierungsfehler bei Enum-Typ:", $BodyType Unknown
378```
379
380</YueDisplay>
381
382## Argument-Validierung 184## Argument-Validierung
383 185
384Du kannst erwartete AST-Knotentypen in der Argumentliste deklarieren und zur Compile-Zeit prüfen, ob die übergebenen Makroargumente den Erwartungen entsprechen. 186Du kannst erwartete AST-Knotentypen in der Argumentliste deklarieren und zur Compile-Zeit prüfen, ob die übergebenen Makroargumente den Erwartungen entsprechen.
@@ -393,20 +195,6 @@ macro printNumAndStr = (num `Num, str `String) -> |
393$printNumAndStr 123, "hallo" 195$printNumAndStr 123, "hallo"
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, "hallo"
406```
407
408</YueDisplay>
409
410Wenn du flexiblere Argumentprüfungen brauchst, kannst du das eingebaute Makro `$is_ast` verwenden, um manuell an der passenden Stelle zu prüfen. 198Wenn du flexiblere Argumentprüfungen brauchst, kannst du das eingebaute Makro `$is_ast` verwenden, um manuell an der passenden Stelle zu prüfen.
411 199
412```yuescript 200```yuescript
@@ -418,19 +206,6 @@ macro printNumAndStr = (num, str) ->
418$printNumAndStr 123, "hallo" 206$printNumAndStr 123, "hallo"
419``` 207```
420 208
421<YueDisplay>
422
423```yue
424macro printNumAndStr = (num, str) ->
425 error "als erstes Argument Num erwartet" unless $is_ast Num, num
426 error "als zweites Argument String erwartet" unless $is_ast String, str
427 "print(#{num}, #{str})"
428
429$printNumAndStr 123, "hallo"
430```
431
432</YueDisplay>
433
434Weitere Details zu verfügbaren AST-Knoten findest du in den großgeschriebenen Definitionen in `yue_parser.cpp`. 209Weitere Details zu verfügbaren AST-Knoten findest du in den großgeschriebenen Definitionen in `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 "Versuche"
489 func 1, 2, 3
490
491-- Verwendung mit if-Zuweisungsmuster
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?` ist eine vereinfachte Fehlerbehandlungs-Syntax, die den booleschen Status aus dem `try`-Statement weglässt. Bei Erfolg gibt sie das Ergebnis des `try`-Blocks zurück, ansonsten `nil` statt eines Fehlerobjekts. 245`try?` ist eine vereinfachte Fehlerbehandlungs-Syntax, die den booleschen Status aus dem `try`-Statement weglässt. Bei Erfolg gibt sie das Ergebnis des `try`-Blocks zurück, ansonsten `nil` statt eines Fehlerobjekts.
@@ -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-- mit Nil-Verschmelzungs-Operator
528a = (try? func!) ?? "Standardwert"
529
530-- als Funktionsargument
531f try? func!
532
533-- mit catch-Block
534f try?
535 print 123
536 func!
537catch e
538 print e
539 e
540```
541
542</YueDisplay>
543
544# Tabellenliterale 265# Tabellenliterale
545 266
546Wie in Lua werden Tabellen mit geschweiften Klammern definiert. 267Wie in Lua werden Tabellen mit geschweiften Klammern definiert.
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
560Anders als in Lua weist man einem Schlüssel in einer Tabelle mit **:** (statt **=**) einen Wert zu. 273Anders als in Lua weist man einem Schlüssel in einer Tabelle mit **:** (statt **=**) einen Wert zu.
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 ["Lieblingsessen"]: "Reis"
577}
578```
579
580</YueDisplay>
581
582Die geschweiften Klammern können weggelassen werden, wenn eine einzelne Tabelle aus Schlüssel-Wert-Paaren zugewiesen wird. 283Die geschweiften Klammern können weggelassen werden, wenn eine einzelne Tabelle aus Schlüssel-Wert-Paaren zugewiesen wird.
583 284
584```yuescript 285```yuescript
@@ -588,17 +289,6 @@ profile =
588 favorite_foods: ["Eis", "Donuts"] 289 favorite_foods: ["Eis", "Donuts"]
589``` 290```
590 291
591<YueDisplay>
592
593```yue
594profile =
595 height: "4 Fuß",
596 shoe_size: 13,
597 favorite_foods: ["Eis", "Donuts"]
598```
599
600</YueDisplay>
601
602Zeilenumbrüche können Werte statt eines Kommas trennen (oder zusätzlich): 292Zeilenumbrüche können Werte statt eines Kommas trennen (oder zusätzlich):
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: "Verbrechensbekämpfung"
621}
622```
623
624</YueDisplay>
625
626Beim Erstellen eines einzeiligen Tabellenliterals können die geschweiften Klammern ebenfalls weggelassen werden: 303Beim Erstellen eines einzeiligen Tabellenliterals können die geschweiften Klammern ebenfalls weggelassen werden:
627 304
628```yuescript 305```yuescript
@@ -631,16 +308,6 @@ my_function dance: "Tango", partner: "keiner"
631y = type: "Hund", legs: 4, tails: 1 308y = type: "Hund", legs: 4, tails: 1
632``` 309```
633 310
634<YueDisplay>
635
636```yue
637my_function dance: "Tango", partner: "keiner"
638
639y = type: "Hund", legs: 4, tails: 1
640```
641
642</YueDisplay>
643
644Die Schlüssel eines Tabellenliterals können Sprach-Schlüsselwörter sein, ohne sie zu escapen: 311Die Schlüssel eines Tabellenliterals können Sprach-Schlüsselwörter sein, ohne sie zu escapen:
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: "etwas"
658 end: "Hunger"
659}
660```
661
662</YueDisplay>
663
664Wenn du eine Tabelle aus Variablen konstruierst und die Schlüssel den Variablennamen entsprechen sollen, kannst du den Präfix-Operator **:** verwenden: 320Wenn du eine Tabelle aus Variablen konstruierst und die Schlüssel den Variablennamen entsprechen sollen, kannst du den Präfix-Operator **:** verwenden:
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
686Wenn der Schlüssel eines Feldes das Ergebnis eines Ausdrucks sein soll, kannst du ihn wie in Lua in **[ ]** setzen. Du kannst auch ein String-Literal direkt als Schlüssel verwenden und die eckigen Klammern weglassen. Das ist nützlich, wenn dein Schlüssel Sonderzeichen enthält. 330Wenn der Schlüssel eines Feldes das Ergebnis eines Ausdrucks sein soll, kannst du ihn wie in Lua in **[ ]** setzen. Du kannst auch ein String-Literal direkt als Schlüssel verwenden und die eckigen Klammern weglassen. Das ist nützlich, wenn dein Schlüssel Sonderzeichen enthält.
687 331
688```yuescript 332```yuescript
@@ -692,33 +336,13 @@ t = {
692} 336}
693``` 337```
694 338
695<YueDisplay> 339Lua-Tabellen haben sowohl einen Array-Teil als auch einen Hash-Teil, aber manchmal ist es nützlich, hier eine semantische Unterscheidung zu treffen. Du kannst **[ ]** anstelle von **{ }** verwenden, um eine Tabelle explizit als Array zu deklarieren; dadurch wird verhindert, dass Schlüssel-Wert-Paare hineingeschrieben werden.
696
697```yue
698t = {
699 [1 + 2]: "hallo"
700 "Hallo Welt": true
701}
702```
703
704</YueDisplay>
705
706Lua-Tabellen haben einen Array-Teil und einen Hash-Teil, aber manchmal möchte man beim Schreiben von Lua-Tabellen eine semantische Unterscheidung zwischen Array- und Hash-Nutzung machen. Dann kannst du eine Lua-Tabelle mit **[ ]** statt **{ }** schreiben, um eine Array-Tabelle darzustellen, und das Schreiben von Schlüssel-Wert-Paaren in einer Listentabelle ist nicht erlaubt.
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# Comprehensions 346# Comprehensions
723 347
724Comprehensions bieten eine bequeme Syntax, um eine neue Tabelle zu erzeugen, indem man über ein bestehendes Objekt iteriert und einen Ausdruck auf seine Werte anwendet. Es gibt zwei Arten: Listen-Comprehensions und Tabellen-Comprehensions. Beide erzeugen Lua-Tabellen; Listen-Comprehensions sammeln Werte in einer array-ähnlichen Tabelle, und Tabellen-Comprehensions erlauben es, Schlüssel und Wert pro Iteration zu setzen. 348Comprehensions bieten eine bequeme Syntax, um eine neue Tabelle zu erzeugen, indem man über ein bestehendes Objekt iteriert und einen Ausdruck auf seine Werte anwendet. Es gibt zwei Arten: Listen-Comprehensions und Tabellen-Comprehensions. Beide erzeugen Lua-Tabellen; Listen-Comprehensions sammeln Werte in einer array-ähnlichen Tabelle, und Tabellen-Comprehensions erlauben es, Schlüssel und Wert pro Iteration zu setzen.
@@ -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
744Die Elemente in der neuen Tabelle können mit einer `when`-Klausel eingeschränkt werden: 359Die Elemente in der neuen Tabelle können mit einer `when`-Klausel eingeschränkt werden:
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
758Da es üblich ist, über die Werte einer numerisch indizierten Tabelle zu iterieren, gibt es den **\***-Operator. Das Verdopplungsbeispiel kann so umgeschrieben werden: 365Da es üblich ist, über die Werte einer numerisch indizierten Tabelle zu iterieren, gibt es den **\***-Operator. Das Verdopplungsbeispiel kann so umgeschrieben werden:
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
772In Listen-Comprehensions kannst du außerdem den Spread-Operator `...` verwenden, um verschachtelte Listen zu flatten und einen Flat-Map-Effekt zu erzielen: 371In Listen-Comprehensions kannst du außerdem den Spread-Operator `...` verwenden, um verschachtelte Listen zu flatten und einen Flat-Map-Effekt zu erzielen:
773 372
774```yuescript 373```yuescript
@@ -780,19 +379,6 @@ flat = [...v for k,v in pairs data]
780-- flat ist jetzt [1, 2, 3, 4, 5, 6] 379-- flat ist jetzt [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 ist jetzt [1, 2, 3, 4, 5, 6]
792```
793
794</YueDisplay>
795
796Die `for`- und `when`-Klauseln können beliebig oft verkettet werden. Die einzige Anforderung ist, dass eine Comprehension mindestens eine `for`-Klausel enthält. 382Die `for`- und `when`-Klauseln können beliebig oft verkettet werden. Die einzige Anforderung ist, dass eine Comprehension mindestens eine `for`-Klausel enthält.
797 383
798Mehrere `for`-Klauseln entsprechen verschachtelten Schleifen: 384Mehrere `for`-Klauseln entsprechen verschachtelten Schleifen:
@@ -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
820Numerische `for`-Schleifen können ebenfalls in Comprehensions verwendet werden: 394Numerische `for`-Schleifen können ebenfalls in Comprehensions verwendet werden:
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## Tabellen-Comprehensions 400## Tabellen-Comprehensions
835 401
836Die Syntax für Tabellen-Comprehensions ist sehr ähnlich, unterscheidet sich jedoch dadurch, dass **{** und **}** verwendet werden und pro Iteration zwei Werte erzeugt werden. 402Die Syntax für Tabellen-Comprehensions ist sehr ähnlich, unterscheidet sich jedoch dadurch, dass **{** und **}** verwendet werden und pro Iteration zwei Werte erzeugt werden.
@@ -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: "rot"
855 name: "schnell"
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
876Der **\***-Operator wird ebenfalls unterstützt. Hier erstellen wir eine Nachschlagetabelle für Quadratwurzeln einiger Zahlen. 420Der **\***-Operator wird ebenfalls unterstützt. Hier erstellen wir eine Nachschlagetabelle für Quadratwurzeln einiger Zahlen.
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
892Das Schlüssel-Wert-Tupel in einer Tabellen-Comprehension kann auch aus einem einzelnen Ausdruck stammen; der Ausdruck muss dann zwei Werte zurückgeben. Der erste wird als Schlüssel und der zweite als Wert verwendet: 427Das Schlüssel-Wert-Tupel in einer Tabellen-Comprehension kann auch aus einem einzelnen Ausdruck stammen; der Ausdruck muss dann zwei Werte zurückgeben. Der erste wird als Schlüssel und der zweite als Wert verwendet:
893 428
894In diesem Beispiel konvertieren wir ein Array von Paaren in eine Tabelle, wobei das erste Element des Paars der Schlüssel und das zweite der Wert ist. 429In diesem Beispiel konvertieren wir ein Array von Paaren in eine Tabelle, wobei das erste Element des Paars der Schlüssel und das zweite der Wert ist.
@@ -898,15 +433,6 @@ tuples = [ ["hallo", "Welt"], ["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 = [ ["hallo", "Welt"], ["foo", "bar"]]
905tbl = {unpack tuple for tuple in *tuples}
906```
907
908</YueDisplay>
909
910## Slicing 436## Slicing
911 437
912Eine spezielle Syntax erlaubt es, die iterierten Elemente bei Verwendung des **\***-Operators einzuschränken. Das ist äquivalent zum Setzen von Iterationsgrenzen und Schrittweite in einer `for`-Schleife. 438Eine spezielle Syntax erlaubt es, die iterierten Elemente bei Verwendung des **\***-Operators einzuschränken. Das ist äquivalent zum Setzen von Iterationsgrenzen und Schrittweite in einer `for`-Schleife.
@@ -917,42 +443,18 @@ Hier setzen wir die minimalen und maximalen Grenzen und nehmen alle Elemente mit
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
928Jedes der Slice-Argumente kann weggelassen werden, um einen sinnvollen Standard zu verwenden. Wenn der maximale Index weggelassen wird, entspricht er der Länge der Tabelle. Dieses Beispiel nimmt alles außer dem ersten Element: 446Jedes der Slice-Argumente kann weggelassen werden, um einen sinnvollen Standard zu verwenden. Wenn der maximale Index weggelassen wird, entspricht er der Länge der Tabelle. Dieses Beispiel nimmt alles außer dem ersten Element:
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
942Wenn die Mindestgrenze weggelassen wird, ist sie standardmäßig 1. Hier geben wir nur die Schrittweite an und lassen die anderen Grenzen leer. Das nimmt alle ungerad indizierten Elemente (1, 3, 5, …): 452Wenn die Mindestgrenze weggelassen wird, ist sie standardmäßig 1. Hier geben wir nur die Schrittweite an und lassen die anderen Grenzen leer. Das nimmt alle ungerad indizierten Elemente (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
956Sowohl die Mindest- als auch die Maximalgrenze können negativ sein; dann werden die Grenzen vom Ende der Tabelle gezählt. 458Sowohl die Mindest- als auch die Maximalgrenze können negativ sein; dann werden die Grenzen vom Ende der Tabelle gezählt.
957 459
958```yuescript 460```yuescript
@@ -960,29 +462,12 @@ Sowohl die Mindest- als auch die Maximalgrenze können negativ sein; dann werden
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-- die letzten 4 Elemente nehmen
967slice = [item for item in *items[-4,-1]]
968```
969
970</YueDisplay>
971
972Die Schrittweite kann ebenfalls negativ sein, wodurch die Elemente in umgekehrter Reihenfolge genommen werden. 465Die Schrittweite kann ebenfalls negativ sein, wodurch die Elemente in umgekehrter Reihenfolge genommen werden.
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### Slicing-Ausdruck 471### Slicing-Ausdruck
987 472
988Slicing kann auch als Ausdruck verwendet werden. Das ist nützlich, um eine Teilliste einer Tabelle zu erhalten. 473Slicing kann auch als Ausdruck verwendet werden. Das ist nützlich, um eine Teilliste einer Tabelle zu erhalten.
@@ -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-- das 2. und 4. Element als neue Liste nehmen
1002sub_list = items[2, 4]
1003
1004-- die letzten 4 Elemente nehmen
1005last_four_items = items[-4, -1]
1006```
1007
1008</YueDisplay>
1009
1010# Objektorientierte Programmierung 483# Objektorientierte Programmierung
1011 484
1012In diesen Beispielen kann der generierte Lua-Code überwältigend wirken. Am besten konzentrierst du dich zunächst auf die Bedeutung des YueScript-Codes und schaust dir den Lua-Code nur an, wenn du die Implementierungsdetails wissen möchtest. 485In diesen Beispielen kann der generierte Lua-Code überwältigend wirken. Am besten konzentrierst du dich zunächst auf die Bedeutung des YueScript-Codes und schaust dir den Lua-Code nur an, wenn du die Implementierungsdetails wissen möchtest.
@@ -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
1044Eine Klasse wird mit einem `class`-Statement deklariert, gefolgt von einer tabellenähnlichen Deklaration mit allen Methoden und Eigenschaften. 501Eine Klasse wird mit einem `class`-Statement deklariert, gefolgt von einer tabellenähnlichen Deklaration mit allen Methoden und Eigenschaften.
1045 502
1046Die Eigenschaft `new` ist besonders, da sie zum Konstruktor wird. 503Die Eigenschaft `new` ist besonders, da sie zum Konstruktor wird.
@@ -1057,16 +514,6 @@ inv\add_item "T-Shirt"
1057inv\add_item "Hose" 514inv\add_item "Hose"
1058``` 515```
1059 516
1060<YueDisplay>
1061
1062```yue
1063inv = Inventory!
1064inv\add_item "T-Shirt"
1065inv\add_item "Hose"
1066```
1067
1068</YueDisplay>
1069
1070Da die Instanz bei Methodenaufrufen an die Methoden übergeben werden muss, wird der `\`-Operator verwendet. 517Da die Instanz bei Methodenaufrufen an die Methoden übergeben werden muss, wird der `\`-Operator verwendet.
1071 518
1072Alle Eigenschaften einer Klasse werden von allen Instanzen gemeinsam genutzt. Für Funktionen ist das ok, aber bei anderen Objekten kann das zu unerwünschten Ergebnissen führen. 519Alle Eigenschaften einer Klasse werden von allen Instanzen gemeinsam genutzt. Für Funktionen ist das ok, aber bei anderen Objekten kann das zu unerwünschten Ergebnissen führen.
@@ -1089,26 +536,6 @@ b\give_item "Hemd"
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 "Hose"
1104b\give_item "Hemd"
1105
1106-- gibt sowohl Hose als auch Hemd aus
1107print item for item in *a.clothes
1108```
1109
1110</YueDisplay>
1111
1112Der richtige Weg, das zu vermeiden, ist, den veränderlichen Zustand im Konstruktor zu erstellen: 539Der richtige Weg, das zu vermeiden, ist, den veränderlichen Zustand im Konstruktor zu erstellen:
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## Vererbung 547## Vererbung
1131 548
1132Das Schlüsselwort `extends` kann in einer Klassendeklaration verwendet werden, um Eigenschaften und Methoden von einer anderen Klasse zu erben. 549Das Schlüsselwort `extends` kann in einer Klassendeklaration verwendet werden, um Eigenschaften und Methoden von einer anderen Klasse zu erben.
@@ -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 "Rucksack ist voll"
1149 super name
1150```
1151
1152</YueDisplay>
1153
1154Hier erweitern wir unsere `Inventory`-Klasse und begrenzen die Anzahl der Elemente. 559Hier erweitern wir unsere `Inventory`-Klasse und begrenzen die Anzahl der Elemente.
1155 560
1156In diesem Beispiel definieren wir keinen Konstruktor in der Subklasse, daher wird der Konstruktor der Elternklasse beim Erstellen einer neuen Instanz aufgerufen. Definieren wir einen Konstruktor, können wir mit `super` den Elternkonstruktor aufrufen. 561In diesem Beispiel definieren wir keinen Konstruktor in der Subklasse, daher wird der Konstruktor der Elternklasse beim Erstellen einer neuen Instanz aufgerufen. Definieren wir einen Konstruktor, können wir mit `super` den Elternkonstruktor aufrufen.
@@ -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, "wurde vererbt von", child.__name
1175
1176-- gibt aus: Shelf wurde von Cupboard geerbt
1177class Cupboard extends Shelf
1178```
1179
1180</YueDisplay>
1181
1182## Super 574## Super
1183 575
1184**super** ist ein spezielles Schlüsselwort, das auf zwei Arten verwendet werden kann: als Objekt oder als Funktionsaufruf. Es hat besondere Funktionalität nur innerhalb einer Klasse. 576**super** ist ein spezielles Schlüsselwort, das auf zwei Arten verwendet werden kann: als Objekt oder als Funktionsaufruf. Es hat besondere Funktionalität nur innerhalb einer Klasse.
@@ -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 -- Folgendes hat dieselbe Wirkung:
1214 super "hallo", "Welt"
1215 super\a_method "hallo", "Welt"
1216 super.a_method self, "hallo", "Welt"
1217
1218 -- super als Wert entspricht der Elternklasse:
1219 assert super == ParentClass
1220```
1221
1222</YueDisplay>
1223
1224**super** kann auch links einer Funktions-Stub verwendet werden. Der einzige große Unterschied ist, dass die resultierende Funktion statt an `super` an `self` gebunden wird. 600**super** kann auch links einer Funktions-Stub verwendet werden. Der einzige große Unterschied ist, dass die resultierende Funktion statt an `super` an `self` gebunden wird.
1225 601
1226## Typen 602## Typen
@@ -1234,17 +610,6 @@ assert b.__class == BackPack
1234print BackPack.size -- gibt 10 aus 610print BackPack.size -- gibt 10 aus
1235``` 611```
1236 612
1237<YueDisplay>
1238
1239```yue
1240b = BackPack!
1241assert b.__class == BackPack
1242
1243print BackPack.size -- gibt 10 aus
1244```
1245
1246</YueDisplay>
1247
1248## Klassenobjekte 613## Klassenobjekte
1249 614
1250Das Klassenobjekt entsteht, wenn wir ein `class`-Statement verwenden. Es wird in einer Variablen mit dem Klassennamen gespeichert. 615Das Klassenobjekt entsteht, wenn wir ein `class`-Statement verwenden. Es wird in einer Variablen mit dem Klassennamen gespeichert.
@@ -1265,14 +630,6 @@ Der Name der Klasse, wie sie deklariert wurde, wird im Feld `__name` gespeichert
1265print BackPack.__name -- gibt Backpack aus 630print BackPack.__name -- gibt Backpack aus
1266``` 631```
1267 632
1268<YueDisplay>
1269
1270```yue
1271print BackPack.__name -- gibt Backpack aus
1272```
1273
1274</YueDisplay>
1275
1276Die Basistabelle ist in `__base` gespeichert. Du kannst diese Tabelle ändern, um Instanzen Funktionalität hinzuzufügen, die bereits existieren oder noch erstellt werden. 633Die Basistabelle ist in `__base` gespeichert. Du kannst diese Tabelle ändern, um Instanzen Funktionalität hinzuzufügen, die bereits existieren oder noch erstellt werden.
1277 634
1278Wenn die Klasse von etwas erbt, ist das Elternklassenobjekt in `__parent` gespeichert. 635Wenn die Klasse von etwas erbt, ist das Elternklassenobjekt in `__parent` gespeichert.
@@ -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 "Hallo von", @__name
1299
1300Things\some_func!
1301
1302-- Klassenvariablen in Instanzen nicht sichtbar
1303assert Things().some_func == nil
1304```
1305
1306</YueDisplay>
1307
1308In Ausdrücken können wir `@@` verwenden, um auf einen Wert zuzugreifen, der in `self.__class` gespeichert ist. `@@hello` ist also eine Kurzform für `self.__class.hello`. 651In Ausdrücken können wir `@@` verwenden, um auf einen Wert zuzugreifen, der in `self.__class` gespeichert ist. `@@hello` ist also eine Kurzform für `self.__class.hello`.
1309 652
1310```yuescript 653```yuescript
@@ -1320,37 +663,12 @@ Counter!
1320print Counter.count -- gibt 2 aus 663print Counter.count -- gibt 2 aus
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 -- gibt 2 aus
1336```
1337
1338</YueDisplay>
1339
1340Die Aufrufsemantik von `@@` ist ähnlich wie bei `@`. Wenn du einen `@@`-Namen aufrufst, wird die Klasse als erstes Argument übergeben (Lua-`:`-Syntax). 666Die Aufrufsemantik von `@@` ist ähnlich wie bei `@`. Wenn du einen `@@`-Namen aufrufst, wird die Klasse als erstes Argument übergeben (Lua-`:`-Syntax).
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## Klassendeklarations-Statements 672## Klassendeklarations-Statements
1355 673
1356Im Rumpf einer Klassendeklaration können wir normale Ausdrücke zusätzlich zu Schlüssel/Wert-Paaren haben. In diesem Kontext ist `self` gleich dem Klassenobjekt. 674Im Rumpf einer Klassendeklaration können wir normale Ausdrücke zusätzlich zu Schlüssel/Wert-Paaren haben. In diesem Kontext ist `self` gleich dem Klassenobjekt.
@@ -1362,15 +680,6 @@ class Things
1362 @class_var = "Hallo Welt" 680 @class_var = "Hallo Welt"
1363``` 681```
1364 682
1365<YueDisplay>
1366
1367```yue
1368class Things
1369 @class_var = "Hallo Welt"
1370```
1371
1372</YueDisplay>
1373
1374Diese Ausdrücke werden ausgeführt, nachdem alle Eigenschaften zur Basis hinzugefügt wurden. 683Diese Ausdrücke werden ausgeführt, nachdem alle Eigenschaften zur Basis hinzugefügt wurden.
1375 684
1376Alle Variablen, die im Klassenkörper deklariert werden, sind lokal zu den Klasseneigenschaften. Das ist praktisch, um private Werte oder Hilfsfunktionen zu platzieren, auf die nur die Klassenmethoden zugreifen können: 685Alle Variablen, die im Klassenkörper deklariert werden, sind lokal zu den Klasseneigenschaften. Das ist praktisch, um private Werte oder Hilfsfunktionen zu platzieren, auf die nur die Klassenmethoden zugreifen können:
@@ -1384,19 +693,6 @@ class MoreThings
1384 log "Hallo Welt: " .. secret 693 log "Hallo Welt: " .. 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 "Hallo Welt: " .. secret
1396```
1397
1398</YueDisplay>
1399
1400## @- und @@-Werte 696## @- und @@-Werte
1401 697
1402Wenn `@` und `@@` vor einem Namen stehen, repräsentieren sie den Namen in `self` bzw. `self.__class`. 698Wenn `@` und `@@` vor einem Namen stehen, repräsentieren sie den Namen in `self` bzw. `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
1420Zum Beispiel kannst du mit `@@` in einer Instanzmethode schnell eine neue Instanz derselben Klasse erzeugen: 707Zum Beispiel kannst du mit `@@` in einer Instanzmethode schnell eine neue Instanz derselben Klasse erzeugen:
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## Konstruktor-Property-Promotion 713## Konstruktor-Property-Promotion
1435 714
1436Um Boilerplate beim Definieren einfacher Value-Objekte zu reduzieren, kannst du eine Klasse so schreiben: 715Um Boilerplate beim Definieren einfacher Value-Objekte zu reduzieren, kannst du eine Klasse so schreiben:
@@ -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-- Kurzform für
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
1470Du kannst diese Syntax auch für eine gemeinsame Funktion verwenden, um Objektfelder zu initialisieren. 731Du kannst diese Syntax auch für eine gemeinsame Funktion verwenden, um Objektfelder zu initialisieren.
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## Klassenausdrücke 739## Klassenausdrücke
1489 740
1490Die `class`-Syntax kann auch als Ausdruck verwendet werden, der einer Variable zugewiesen oder explizit zurückgegeben wird. 741Die `class`-Syntax kann auch als Ausdruck verwendet werden, der einer Variable zugewiesen oder explizit zurückgegeben wird.
@@ -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## Anonyme Klassen 749## Anonyme Klassen
1509 750
1510Der Name kann beim Deklarieren einer Klasse weggelassen werden. Das `__name`-Attribut ist dann `nil`, es sei denn, der Klassenausdruck steht in einer Zuweisung. In diesem Fall wird der Name auf der linken Seite statt `nil` verwendet. 751Der Name kann beim Deklarieren einer Klasse weggelassen werden. Das `__name`-Attribut ist dann `nil`, es sei denn, der Klassenausdruck steht in einer Zuweisung. In diesem Fall wird der Name auf der linken Seite statt `nil` verwendet.
@@ -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
1530Du kannst sogar den Körper weglassen und eine leere anonyme Klasse schreiben: 760Du kannst sogar den Körper weglassen und eine leere anonyme Klasse schreiben:
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## Class Mixing 766## Class Mixing
1545 767
1546Du kannst mit dem Schlüsselwort `using` mischen, um Funktionen aus einer einfachen Tabelle oder einem vordefinierten Klassenobjekt in deine neue Klasse zu kopieren. Beim Mischen mit einer einfachen Tabelle kannst du die Klassen-Indexing-Funktion (Metamethod `__index`) überschreiben. Beim Mischen mit einem bestehenden Klassenobjekt werden dessen Metamethoden nicht kopiert. 768Du kannst mit dem Schlüsselwort `using` mischen, um Funktionen aus einer einfachen Tabelle oder einem vordefinierten Klassenobjekt in deine neue Klasse zu kopieren. Beim Mischen mit einer einfachen Tabelle kannst du die Klassen-Indexing-Funktion (Metamethod `__index`) überschreiben. Beim Mischen mit einem bestehenden Klassenobjekt werden dessen Metamethoden nicht kopiert.
@@ -1563,28 +785,6 @@ y\func!
1563assert y.__class.__parent ~= X -- X ist nicht die Elternklasse von Y 785assert y.__class.__parent ~= X -- X ist nicht die Elternklasse von 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 ist nicht die Elternklasse von Y
1584```
1585
1586</YueDisplay>
1587
1588# With-Statement 788# With-Statement
1589 789
1590Ein häufiges Muster bei der Erstellung eines Objekts ist, unmittelbar danach eine Reihe von Funktionen aufzurufen und Eigenschaften zu setzen. 790Ein häufiges Muster bei der Erstellung eines Objekts ist, unmittelbar danach eine Reihe von Funktionen aufzurufen und Eigenschaften zu setzen.
@@ -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
1618Das `with`-Statement kann auch als Ausdruck verwendet werden und gibt den Wert zurück, auf den es Zugriff gewährt. 806Das `with`-Statement kann auch als Ausdruck verwendet werden und gibt den Wert zurück, auf den es Zugriff gewährt.
1619 807
1620```yuescript 808```yuescript
@@ -1622,15 +810,6 @@ file = with File "Lieblingsessen.txt"
1622 \set_encoding "utf8" 810 \set_encoding "utf8"
1623``` 811```
1624 812
1625<YueDisplay>
1626
1627```yue
1628file = with File "Lieblingsessen.txt"
1629 \set_encoding "utf8"
1630```
1631
1632</YueDisplay>
1633
1634`with`-Ausdrücke unterstützen `break` mit genau einem Wert: 813`with`-Ausdrücke unterstützen `break` mit genau einem Wert:
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
1650Sobald `break value` in `with` verwendet wird, gibt der `with`-Ausdruck nicht mehr sein Zielobjekt zurück, sondern den von `break` gelieferten Wert. 820Sobald `break value` in `with` verwendet wird, gibt der `with`-Ausdruck nicht mehr sein Zielobjekt zurück, sondern den von `break` gelieferten Wert.
1651 821
1652```yuescript 822```yuescript
@@ -1659,20 +829,6 @@ b = with obj
1659-- b ist .x, nicht obj 829-- b ist .x, nicht obj
1660``` 830```
1661 831
1662<YueDisplay>
1663
1664```yue
1665a = with obj
1666 .x = 1
1667-- a ist obj
1668
1669b = with obj
1670 break .x
1671-- b ist .x, nicht obj
1672```
1673
1674</YueDisplay>
1675
1676Im Unterschied zu `for` / `while` / `repeat` / `do` unterstützt `with` nur einen `break`-Wert. 832Im Unterschied zu `for` / `while` / `repeat` / `do` unterstützt `with` nur einen `break`-Wert.
1677 833
1678Oder … 834Oder …
@@ -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
1702In dieser Verwendung kann `with` als spezielle Form des K-Kombinators gesehen werden. 845In dieser Verwendung kann `with` als spezielle Form des K-Kombinators gesehen werden.
1703 846
1704Der Ausdruck im `with`-Statement kann auch eine Zuweisung sein, wenn du dem Ausdruck einen Namen geben willst. 847Der Ausdruck im `with`-Statement kann auch eine Zuweisung sein, wenn du dem Ausdruck einen Namen geben willst.
@@ -1709,16 +852,6 @@ with str := "Hallo"
1709 print "Großbuchstaben:", \upper! 852 print "Großbuchstaben:", \upper!
1710``` 853```
1711 854
1712<YueDisplay>
1713
1714```yue
1715with str := "Hallo"
1716 print "Original:", str
1717 print "Großbuchstaben:", \upper!
1718```
1719
1720</YueDisplay>
1721
1722Du kannst in einem `with`-Statement über `[]` auf spezielle Schlüssel zugreifen. 855Du kannst in einem `with`-Statement über `[]` auf spezielle Schlüssel zugreifen.
1723 856
1724```yuescript 857```yuescript
@@ -1731,20 +864,6 @@ with tb
1731 [] = "abc" -- an "tb" anhängen 864 [] = "abc" -- an "tb" anhängen
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" -- an "tb" anhängen
1744```
1745
1746</YueDisplay>
1747
1748`with?` ist eine erweiterte Version der `with`-Syntax, die einen Existenz-Check einführt, um Objekte, die `nil` sein könnten, sicher zuzugreifen, ohne explizite Nullprüfungen. 867`with?` ist eine erweiterte Version der `with`-Syntax, die einen Existenz-Check einführt, um Objekte, die `nil` sein könnten, sicher zuzugreifen, ohne explizite Nullprüfungen.
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# Zuweisung 874# Zuweisung
1765 875
1766Variablen sind dynamisch typisiert und standardmäßig `local`. Du kannst den Geltungsbereich mit den Statements **local** und **global** ändern. 876Variablen sind dynamisch typisiert und standardmäßig `local`. Du kannst den Geltungsbereich mit den Statements **local** und **global** ändern.
@@ -1771,16 +881,6 @@ a, b, c = 1, 2, 3
1771hello = 123 -- nutzt die bestehende Variable 881hello = 123 -- nutzt die bestehende Variable
1772``` 882```
1773 883
1774<YueDisplay>
1775
1776```yue
1777hello = "world"
1778a, b, c = 1, 2, 3
1779hello = 123 -- nutzt die bestehende Variable
1780```
1781
1782</YueDisplay>
1783
1784## Update-Zuweisung 884## Update-Zuweisung
1785 885
1786Du kannst Update-Zuweisungen mit vielen binären Operatoren durchführen. 886Du kannst Update-Zuweisungen mit vielen binären Operatoren durchführen.
@@ -1796,21 +896,6 @@ s ..= "world" -- legt eine neue lokale Variable an, wenn sie nicht existiert
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" -- legt eine neue lokale Variable an, wenn sie nicht existiert
1809arg or= "default value"
1810```
1811
1812</YueDisplay>
1813
1814## Verkettete Zuweisung 899## Verkettete Zuweisung
1815 900
1816Mit verketteten Zuweisungen kannst du mehrere Variablen auf denselben Wert setzen. 901Mit verketteten Zuweisungen kannst du mehrere Variablen auf denselben Wert setzen.
@@ -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## Explizite Locals 908## Explizite Locals
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 "forward declare all variables as locals"
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 "only forward declare upper case variables"
1866 a = 1
1867 B = 2
1868```
1869
1870</YueDisplay>
1871
1872## Explizite Globals 927## Explizite Globals
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 "declare all variables as globals"
1898 x = -> 1 + y + z
1899 y, z = 2, 3
1900
1901do
1902 global X = 1
1903 global ^
1904 print "only declare upper case variables as globals"
1905 a = 1
1906 B = 2
1907 local Temp = "a local value"
1908```
1909
1910</YueDisplay>
1911
1912# Varargs-Zuweisung 946# Varargs-Zuweisung
1913 947
1914Du kannst Rückgabewerte einer Funktion dem Varargs-Symbol `...` zuweisen und dann den Inhalt auf die Lua-Weise auslesen. 948Du kannst Rückgabewerte einer Funktion dem Varargs-Symbol `...` zuweisen und dann den Inhalt auf die Lua-Weise auslesen.
@@ -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# If-Zuweisung 959# If-Zuweisung
1939 960
1940`if`- und `elseif`-Blöcke können eine Zuweisung anstelle eines Bedingungsausdrucks enthalten. Beim Auswerten der Bedingung findet die Zuweisung statt, und der zugewiesene Wert wird als Bedingung verwendet. Die zugewiesene Variable ist nur im Geltungsbereich des Bedingungsblocks verfügbar, d. h. sie ist nicht verfügbar, wenn der Wert nicht truthy ist. Für die Zuweisung musst du den "Walrus-Operator" `:=` statt `=` verwenden. 961`if`- und `elseif`-Blöcke können eine Zuweisung anstelle eines Bedingungsausdrucks enthalten. Beim Auswerten der Bedingung findet die Zuweisung statt, und der zugewiesene Wert wird als Bedingung verwendet. Die zugewiesene Variable ist nur im Geltungsbereich des Bedingungsblocks verfügbar, d. h. sie ist nicht verfügbar, wenn der Wert nicht truthy ist. Für die Zuweisung musst du den "Walrus-Operator" `:=` statt `=` verwenden.
@@ -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 "Du hast hello", hello 970 print "Du hast hello", hello
@@ -1962,19 +974,6 @@ else
1962 print "nichts :(" 974 print "nichts :("
1963``` 975```
1964 976
1965<YueDisplay>
1966
1967```yue
1968if hello := os.getenv "hello"
1969 print "Du hast hello", hello
1970elseif world := os.getenv "world"
1971 print "Du hast world", world
1972else
1973 print "nichts :("
1974```
1975
1976</YueDisplay>
1977
1978If-Zuweisung mit mehreren Rückgabewerten. Nur der erste Wert wird geprüft, andere Werte bleiben im Scope. 977If-Zuweisung mit mehreren Rückgabewerten. Nur der erste Wert wird geprüft, andere Werte bleiben im Scope.
1979 978
1980```yuescript 979```yuescript
@@ -1983,16 +982,6 @@ if success, result := pcall -> "Ergebnis ohne Probleme erhalten"
1983print "OK" 982print "OK"
1984``` 983```
1985 984
1986<YueDisplay>
1987
1988```yue
1989if success, result := pcall -> "Ergebnis ohne Probleme erhalten"
1990 print result -- Variable result ist im Scope
1991print "OK"
1992```
1993
1994</YueDisplay>
1995
1996## While-Zuweisung 985## While-Zuweisung
1997 986
1998Du kannst if-Zuweisung auch in einer while-Schleife verwenden, um den Wert als Schleifenbedingung zu nutzen. 987Du kannst if-Zuweisung auch in einer while-Schleife verwenden, um den Wert als Schleifenbedingung zu nutzen.
@@ -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 -- mit dem Byte etwas anfangen
2011 print byte
2012```
2013
2014</YueDisplay>
2015
2016# Destructuring-Zuweisung 995# Destructuring-Zuweisung
2017 996
2018Destructuring-Zuweisung ist eine Möglichkeit, schnell Werte aus einer Tabelle nach Name oder Position in array-basierten Tabellen zu extrahieren. 997Destructuring-Zuweisung ist eine Möglichkeit, schnell Werte aus einer Tabelle nach Name oder Position in array-basierten Tabellen zu extrahieren.
@@ -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
2042Im Destructuring-Tabellenliteral repräsentiert der Schlüssel den zu lesenden Schlüssel der rechten Seite, und der Wert ist der Name, dem der gelesene Wert zugewiesen wird. 1010Im Destructuring-Tabellenliteral repräsentiert der Schlüssel den zu lesenden Schlüssel der rechten Seite, und der Wert ist der Name, dem der gelesene Wert zugewiesen wird.
2043 1011
2044```yuescript 1012```yuescript
@@ -2054,23 +1022,6 @@ print hello, the_day
2054:day = obj -- einfache Destructuring-Zuweisung ohne Klammern ist ok 1022:day = obj -- einfache Destructuring-Zuweisung ohne Klammern ist ok
2055``` 1023```
2056 1024
2057<YueDisplay>
2058
2059```yue
2060obj = {
2061 hello: "Welt"
2062 day: "Dienstag"
2063 length: 20
2064}
2065
2066{hello: hello, day: the_day} = obj
2067print hello, the_day
2068
2069:day = obj -- einfache Destructuring-Zuweisung ohne Klammern ist ok
2070```
2071
2072</YueDisplay>
2073
2074Das funktioniert auch mit verschachtelten Datenstrukturen: 1025Das funktioniert auch mit verschachtelten Datenstrukturen:
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: "grün"
2096 height: 13.5
2097 }
2098}
2099
2100{numbers: [first, second], properties: {color: color}} = obj2
2101print first, second, color
2102```
2103
2104</YueDisplay>
2105
2106Wenn die Destructuring-Anweisung kompliziert ist, kannst du sie gerne auf mehrere Zeilen verteilen. Ein etwas komplexeres Beispiel: 1040Wenn die Destructuring-Anweisung kompliziert ist, kannst du sie gerne auf mehrere Zeilen verteilen. Ein etwas komplexeres Beispiel:
2107 1041
2108```yuescript 1042```yuescript
@@ -2114,75 +1048,30 @@ Wenn die Destructuring-Anweisung kompliziert ist, kannst du sie gerne auf mehrer
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
2130Es ist üblich, Werte aus einer Tabelle zu extrahieren und ihnen lokale Variablen mit demselben Namen wie der Schlüssel zuzuweisen. Um Wiederholungen zu vermeiden, kannst du den Präfix-Operator **:** verwenden: 1051Es ist üblich, Werte aus einer Tabelle zu extrahieren und ihnen lokale Variablen mit demselben Namen wie der Schlüssel zuzuweisen. Um Wiederholungen zu vermeiden, kannst du den Präfix-Operator **:** verwenden:
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
2144Das ist effektiv dasselbe wie `import`, aber du kannst Felder umbenennen, indem du die Syntax mischst: 1057Das ist effektiv dasselbe wie `import`, aber du kannst Felder umbenennen, indem du die Syntax mischst:
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
2158Du kannst Standardwerte beim Destructuring angeben, z. B.: 1063Du kannst Standardwerte beim Destructuring angeben, z. B.:
2159 1064
2160```yuescript 1065```yuescript
2161{:name = "namenlos", :job = "arbeitlos"} = person 1066{:name = "namenlos", :job = "arbeitlos"} = person
2162``` 1067```
2163 1068
2164<YueDisplay>
2165
2166```yue
2167{:name = "namenlos", :job = "arbeitlos"} = person
2168```
2169
2170</YueDisplay>
2171
2172Du kannst `_` als Platzhalter verwenden, wenn du eine Listen-Destructuring-Zuweisung machst: 1069Du kannst `_` als Platzhalter verwenden, wenn du eine Listen-Destructuring-Zuweisung machst:
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## Bereichs-Destructuring 1075## Bereichs-Destructuring
2187 1076
2188Du kannst den Spread-Operator `...` in Listen-Destructuring verwenden, um einen Wertebereich zu erfassen. Das ist nützlich, wenn du bestimmte Elemente am Anfang und Ende einer Liste extrahieren und den Rest dazwischen sammeln willst. 1077Du kannst den Spread-Operator `...` in Listen-Destructuring verwenden, um einen Wertebereich zu erfassen. Das ist nützlich, wenn du bestimmte Elemente am Anfang und Ende einer Liste extrahieren und den Rest dazwischen sammeln willst.
@@ -2195,18 +1084,6 @@ print bulk -- gibt aus: {"zweiter", "dritter", "vierter"}
2195print last -- gibt aus: letzter 1084print last -- gibt aus: letzter
2196``` 1085```
2197 1086
2198<YueDisplay>
2199
2200```yue
2201orders = ["erster", "zweiter", "dritter", "vierter", "letzter"]
2202[first, ...bulk, last] = orders
2203print first -- gibt aus: erster
2204print bulk -- gibt aus: {"zweiter", "dritter", "vierter"}
2205print last -- gibt aus: letzter
2206```
2207
2208</YueDisplay>
2209
2210Der Spread-Operator kann an unterschiedlichen Positionen verwendet werden, um unterschiedliche Bereiche zu erfassen, und du kannst `_` als Platzhalter für Werte verwenden, die du nicht erfassen willst: 1087Der Spread-Operator kann an unterschiedlichen Positionen verwendet werden, um unterschiedliche Bereiche zu erfassen, und du kannst `_` als Platzhalter für Werte verwenden, die du nicht erfassen willst:
2211 1088
2212```yuescript 1089```yuescript
@@ -2220,21 +1097,6 @@ Der Spread-Operator kann an unterschiedlichen Positionen verwendet werden, um un
2220[first, ..._, last] = orders 1097[first, ..._, last] = orders
2221``` 1098```
2222 1099
2223<YueDisplay>
2224
2225```yue
2226-- Alles nach dem ersten Element erfassen
2227[first, ...rest] = orders
2228
2229-- Alles vor dem letzten Element erfassen
2230[...start, last] = orders
2231
2232-- Alles außer den mittleren Elementen erfassen
2233[first, ..._, last] = orders
2234```
2235
2236</YueDisplay>
2237
2238## Destructuring an anderen Stellen 1100## Destructuring an anderen Stellen
2239 1101
2240Destructuring kann auch an Stellen vorkommen, an denen eine Zuweisung implizit erfolgt. Ein Beispiel ist eine `for`-Schleife: 1102Destructuring kann auch an Stellen vorkommen, an denen eine Zuweisung implizit erfolgt. Ein Beispiel ist eine `for`-Schleife:
@@ -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 ["hallo", "Welt"]
2257 ["Ei", "Kopf"]
2258]
2259
2260for [left, right] in *tuples
2261 print left, right
2262```
2263
2264</YueDisplay>
2265
2266Wir wissen, dass jedes Element der Array-Tabelle ein 2er-Tupel ist, daher können wir es direkt in der Namensliste der `for`-Anweisung mittels Destructuring entpacken. 1114Wir wissen, dass jedes Element der Array-Tabelle ein 2er-Tupel ist, daher können wir es direkt in der Namensliste der `for`-Anweisung mittels Destructuring entpacken.
2267 1115
2268# Die Using-Klausel: Destruktive Zuweisung kontrollieren 1116# Die Using-Klausel: Destruktive Zuweisung kontrollieren
@@ -2285,26 +1133,6 @@ my_func!
2285print i -- wird 0 ausgeben 1133print i -- wird 0 ausgeben
2286``` 1134```
2287 1135
2288<YueDisplay>
2289
2290```yue
2291i = 100
2292
2293-- viele Zeilen Code...
2294
2295my_func = ->
2296 i = 10
2297 while i > 0
2298 print i
2299 i -= 1
2300
2301my_func!
2302
2303print i -- wird 0 ausgeben
2304```
2305
2306</YueDisplay>
2307
2308In `my_func` haben wir den Wert von `i` versehentlich überschrieben. In diesem Beispiel ist es offensichtlich, aber in einer großen oder fremden Codebasis ist oft nicht klar, welche Namen bereits deklariert wurden. 1136In `my_func` haben wir den Wert von `i` versehentlich überschrieben. In diesem Beispiel ist es offensichtlich, aber in einer großen oder fremden Codebasis ist oft nicht klar, welche Namen bereits deklariert wurden.
2309 1137
2310Es wäre hilfreich, anzugeben, welche Variablen aus dem umschließenden Scope wir verändern wollen, um versehentliche Änderungen zu vermeiden. 1138Es wäre hilfreich, anzugeben, welche Variablen aus dem umschließenden Scope wir verändern wollen, um versehentliche Änderungen zu vermeiden.
@@ -2321,20 +1149,6 @@ my_func!
2321print i -- gibt 100 aus, i bleibt unverändert 1149print i -- gibt 100 aus, i bleibt unverändert
2322``` 1150```
2323 1151
2324<YueDisplay>
2325
2326```yue
2327i = 100
2328
2329my_func = (using nil) ->
2330 i = "hello" -- hier wird eine neue lokale Variable erstellt
2331
2332my_func!
2333print i -- gibt 100 aus, i bleibt unverändert
2334```
2335
2336</YueDisplay>
2337
2338Mehrere Namen können durch Kommas getrennt werden. Closure-Werte können weiterhin gelesen, aber nicht verändert werden: 1152Mehrere Namen können durch Kommas getrennt werden. Closure-Werte können weiterhin gelesen, aber nicht verändert werden:
2339 1153
2340```yuescript 1154```yuescript
@@ -2350,23 +1164,6 @@ my_func(22)
2350print i, k -- diese wurden aktualisiert 1164print i, k -- diese wurden aktualisiert
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 -- ein neues lokales tmp wird erstellt
2361 i += tmp
2362 k += tmp
2363
2364my_func(22)
2365print i, k -- diese wurden aktualisiert
2366```
2367
2368</YueDisplay>
2369
2370# Verwendung 1167# Verwendung
2371 1168
2372## Lua-Modul 1169## Lua-Modul
@@ -2536,55 +1333,6 @@ with apple
2536export 🌛 = "Skript des Mondes" 1333export 🌛 = "Skript des Mondes"
2537``` 1334```
2538 1335
2539<YueDisplay>
2540
2541```yue
2542-- Import-Syntax
2543import p, to_lua from "yue"
2544
2545-- Objekt-Literale
2546inventory =
2547 equipment:
2548 - "Schwert"
2549 - "Schild"
2550 items:
2551 - name: "Trank"
2552 count: 10
2553 - name: "Brot"
2554 count: 3
2555
2556-- Listen-Abstraktion
2557map = (arr, action) ->
2558 [action item for item in *arr]
2559
2560filter = (arr, cond) ->
2561 [item for item in *arr when cond item]
2562
2563reduce = (arr, init, action): init ->
2564 init = action init, item for item in *arr
2565
2566-- Pipe-Operator
2567[1, 2, 3]
2568 |> map (x) -> x * 2
2569 |> filter (x) -> x > 4
2570 |> reduce 0, (a, b) -> a + b
2571 |> print
2572
2573-- Metatable-Manipulation
2574apple =
2575 size: 15
2576 <index>:
2577 color: 0x00ffff
2578
2579with apple
2580 p .size, .color, .<index> if .<>?
2581
2582-- export-Syntax (ähnlich wie in JavaScript)
2583export 🌛 = "Skript des Mondes"
2584```
2585
2586</YueDisplay>
2587
2588## Über Dora SSR 1336## Über Dora SSR
2589 1337
2590YueScript wird zusammen mit der Open-Source-Spiel-Engine [Dora SSR](https://github.com/Dora-SSR/Dora-SSR) entwickelt und gepflegt. Es wird zum Erstellen von Engine-Tools, Spiel-Demos und Prototypen eingesetzt und hat seine Leistungsfähigkeit in realen Szenarien unter Beweis gestellt, während es gleichzeitig die Dora-SSR-Entwicklungserfahrung verbessert. 1338YueScript wird zusammen mit der Open-Source-Spiel-Engine [Dora SSR](https://github.com/Dora-SSR/Dora-SSR) entwickelt und gepflegt. Es wird zum Erstellen von Engine-Tools, Spiel-Demos und Prototypen eingesetzt und hat seine Leistungsfähigkeit in realen Szenarien unter Beweis gestellt, während es gleichzeitig die Dora-SSR-Entwicklungserfahrung verbessert.
@@ -2643,18 +1391,6 @@ else
2643 print "Keine Münzen" 1391 print "Keine Münzen"
2644``` 1392```
2645 1393
2646<YueDisplay>
2647
2648```yue
2649have_coins = false
2650if have_coins
2651 print "Münzen erhalten"
2652else
2653 print "Keine Münzen"
2654```
2655
2656</YueDisplay>
2657
2658Eine Kurzsyntax für einzelne Anweisungen kann ebenfalls verwendet werden: 1394Eine Kurzsyntax für einzelne Anweisungen kann ebenfalls verwendet werden:
2659 1395
2660```yuescript 1396```yuescript
@@ -2662,15 +1398,6 @@ have_coins = false
2662if have_coins then print "Münzen erhalten" else print "Keine Münzen" 1398if have_coins then print "Münzen erhalten" else print "Keine Münzen"
2663``` 1399```
2664 1400
2665<YueDisplay>
2666
2667```yue
2668have_coins = false
2669if have_coins then print "Münzen erhalten" else print "Keine Münzen"
2670```
2671
2672</YueDisplay>
2673
2674Da `if`-Anweisungen als Ausdrücke verwendet werden können, kann man das auch so schreiben: 1401Da `if`-Anweisungen als Ausdrücke verwendet werden können, kann man das auch so schreiben:
2675 1402
2676```yuescript 1403```yuescript
@@ -2678,15 +1405,6 @@ have_coins = false
2678print if have_coins then "Münzen erhalten" else "Keine Münzen" 1405print if have_coins then "Münzen erhalten" else "Keine Münzen"
2679``` 1406```
2680 1407
2681<YueDisplay>
2682
2683```yue
2684have_coins = false
2685print if have_coins then "Münzen erhalten" else "Keine Münzen"
2686```
2687
2688</YueDisplay>
2689
2690Bedingungen können auch in `return`-Anweisungen und Zuweisungen verwendet werden: 1408Bedingungen können auch in `return`-Anweisungen und Zuweisungen verwendet werden:
2691 1409
2692```yuescript 1410```yuescript
@@ -2704,25 +1422,6 @@ else
2704print message -- gibt aus: Ich bin sehr groß 1422print message -- gibt aus: Ich bin sehr groß
2705``` 1423```
2706 1424
2707<YueDisplay>
2708
2709```yue
2710is_tall = (name) ->
2711 if name == "Rob"
2712 true
2713 else
2714 false
2715
2716message = if is_tall "Rob"
2717 "Ich bin sehr groß"
2718else
2719 "Ich bin nicht so groß"
2720
2721print message -- gibt aus: Ich bin sehr groß
2722```
2723
2724</YueDisplay>
2725
2726Das Gegenteil von `if` ist `unless`: 1425Das Gegenteil von `if` ist `unless`:
2727 1426
2728```yuescript 1427```yuescript
@@ -2730,27 +1429,10 @@ unless os.date("%A") == "Monday"
2730 print "Es ist nicht Montag!" 1429 print "Es ist nicht Montag!"
2731``` 1430```
2732 1431
2733<YueDisplay>
2734
2735```yue
2736unless os.date("%A") == "Monday"
2737 print "Es ist nicht Montag!"
2738```
2739
2740</YueDisplay>
2741
2742```yuescript 1432```yuescript
2743print "You're lucky!" unless math.random! > 0.1 1433print "You're lucky!" unless math.random! > 0.1
2744``` 1434```
2745 1435
2746<YueDisplay>
2747
2748```yue
2749print "You're lucky!" unless math.random! > 0.1
2750```
2751
2752</YueDisplay>
2753
2754## In-Ausdruck 1436## In-Ausdruck
2755 1437
2756Mit einem `in`-Ausdruck kannst du Bereichsprüfungen schreiben. 1438Mit einem `in`-Ausdruck kannst du Bereichsprüfungen schreiben.
@@ -2765,20 +1447,6 @@ if a in list
2765 print "Prüfen, ob `a` in einer Liste ist" 1447 print "Prüfen, ob `a` in einer Liste ist"
2766``` 1448```
2767 1449
2768<YueDisplay>
2769
2770```yue
2771a = 5
2772
2773if a in [1, 3, 5, 7]
2774 print "Gleichheitsprüfung mit diskreten Werten"
2775
2776if a in list
2777 print "Prüfen, ob `a` in einer Liste ist"
2778```
2779
2780</YueDisplay>
2781
2782Der `in`-Operator kann auch mit Tabellen verwendet werden und unterstützt die Variante `not in` für Verneinungen: 1450Der `in`-Operator kann auch mit Tabellen verwendet werden und unterstützt die Variante `not in` für Verneinungen:
2783 1451
2784```yuescript 1452```yuescript
@@ -2792,21 +1460,6 @@ not_exist = item not in list
2792check = -> value not in table 1460check = -> value not in table
2793``` 1461```
2794 1462
2795<YueDisplay>
2796
2797```yue
2798has = "foo" in {"bar", "foo"}
2799
2800if a in {1, 2, 3}
2801 print "a ist in der Tabelle"
2802
2803not_exist = item not in list
2804
2805check = -> value not in table
2806```
2807
2808</YueDisplay>
2809
2810Eine Ein-Element-Liste oder Tabelle prüft auf Gleichheit mit diesem Element: 1463Eine Ein-Element-Liste oder Tabelle prüft auf Gleichheit mit diesem Element:
2811 1464
2812```yuescript 1465```yuescript
@@ -2821,22 +1474,6 @@ with tb
2821 c = a in [1] 1474 c = a in [1]
2822``` 1475```
2823 1476
2824<YueDisplay>
2825
2826```yue
2827-- [1,] prüft, ob wert == 1
2828c = a in [1,]
2829
2830-- {1} prüft auch, ob wert == 1
2831c = a in {1}
2832
2833-- Ohne Komma ist [1] ein Indexzugriff (tb[1])
2834with tb
2835 c = a in [1]
2836```
2837
2838</YueDisplay>
2839
2840# For-Schleife 1477# For-Schleife
2841 1478
2842Es gibt zwei Formen der `for`-Schleife, genau wie in Lua: eine numerische und eine generische. 1479Es gibt zwei Formen der `for`-Schleife, genau wie in Lua: eine numerische und eine generische.
@@ -2852,21 +1489,6 @@ for key, value in pairs object
2852 print key, value 1489 print key, value
2853``` 1490```
2854 1491
2855<YueDisplay>
2856
2857```yue
2858for i = 10, 20
2859 print i
2860
2861for k = 1, 15, 2 -- ein optionaler Schritt
2862 print k
2863
2864for key, value in pairs object
2865 print key, value
2866```
2867
2868</YueDisplay>
2869
2870Die Slicing- und **\***-Operatoren können verwendet werden, genau wie bei Comprehensions: 1492Die Slicing- und **\***-Operatoren können verwendet werden, genau wie bei Comprehensions:
2871 1493
2872```yuescript 1494```yuescript
@@ -2874,15 +1496,6 @@ for item in *items[2, 4]
2874 print item 1496 print item
2875``` 1497```
2876 1498
2877<YueDisplay>
2878
2879```yue
2880for item in *items[2, 4]
2881 print item
2882```
2883
2884</YueDisplay>
2885
2886Eine kürzere Syntax ist für alle Varianten verfügbar, wenn der Rumpf nur eine Zeile hat: 1499Eine kürzere Syntax ist für alle Varianten verfügbar, wenn der Rumpf nur eine Zeile hat:
2887 1500
2888```yuescript 1501```yuescript
@@ -2891,16 +1504,6 @@ for item in *items do print item
2891for j = 1, 10, 3 do print j 1504for j = 1, 10, 3 do print j
2892``` 1505```
2893 1506
2894<YueDisplay>
2895
2896```yue
2897for item in *items do print item
2898
2899for j = 1, 10, 3 do print j
2900```
2901
2902</YueDisplay>
2903
2904Eine `for`-Schleife kann auch als Ausdruck verwendet werden. Die letzte Anweisung im Schleifenrumpf wird in einen Ausdruck umgewandelt und an eine wachsende Array-Tabelle angehängt. 1507Eine `for`-Schleife kann auch als Ausdruck verwendet werden. Die letzte Anweisung im Schleifenrumpf wird in einen Ausdruck umgewandelt und an eine wachsende Array-Tabelle angehängt.
2905 1508
2906Alle geraden Zahlen verdoppeln: 1509Alle geraden Zahlen verdoppeln:
@@ -2913,18 +1516,6 @@ doubled_evens = for i = 1, 20
2913 i 1516 i
2914``` 1517```
2915 1518
2916<YueDisplay>
2917
2918```yue
2919doubled_evens = for i = 1, 20
2920 if i % 2 == 0
2921 i * 2
2922 else
2923 i
2924```
2925
2926</YueDisplay>
2927
2928Zusätzlich unterstützen `for`-Schleifen `break` mit Rückgabewerten, sodass die Schleife selbst als Ausdruck verwendet werden kann, der früh mit einem sinnvollen Ergebnis endet. `for`-Ausdrücke unterstützen mehrere `break`-Werte. 1519Zusätzlich unterstützen `for`-Schleifen `break` mit Rückgabewerten, sodass die Schleife selbst als Ausdruck verwendet werden kann, der früh mit einem sinnvollen Ergebnis endet. `for`-Ausdrücke unterstützen mehrere `break`-Werte.
2929 1520
2930Beispiel: die erste Zahl größer als 10 finden: 1521Beispiel: die erste Zahl größer als 10 finden:
@@ -2934,15 +1525,6 @@ first_large = for n in *numbers
2934 break n if n > 10 1525 break n if n > 10
2935``` 1526```
2936 1527
2937<YueDisplay>
2938
2939```yue
2940first_large = for n in *numbers
2941 break n if n > 10
2942```
2943
2944</YueDisplay>
2945
2946Diese `break`-mit-Wert-Syntax ermöglicht knappe und ausdrucksstarke Such- bzw. Early-Exit-Muster direkt in Schleifenausdrücken. 1528Diese `break`-mit-Wert-Syntax ermöglicht knappe und ausdrucksstarke Such- bzw. Early-Exit-Muster direkt in Schleifenausdrücken.
2947 1529
2948```yuescript 1530```yuescript
@@ -2950,15 +1532,6 @@ key, score = for k, v in pairs data
2950 break k, v * 10 if k == "target" 1532 break k, v * 10 if k == "target"
2951``` 1533```
2952 1534
2953<YueDisplay>
2954
2955```yue
2956key, score = for k, v in pairs data
2957 break k, v * 10 if k == "target"
2958```
2959
2960</YueDisplay>
2961
2962Du kannst Werte auch filtern, indem du den `for`-Ausdruck mit `continue` kombinierst. 1535Du kannst Werte auch filtern, indem du den `for`-Ausdruck mit `continue` kombinierst.
2963 1536
2964`for`-Schleifen am Ende eines Funktionsrumpfs werden nicht in eine Tabelle für einen Rückgabewert gesammelt (stattdessen gibt die Funktion `nil` zurück). Du kannst entweder explizit `return` verwenden oder die Schleife in eine Listen-Comprehension umwandeln. 1537`for`-Schleifen am Ende eines Funktionsrumpfs werden nicht in eine Tabelle für einen Rückgabewert gesammelt (stattdessen gibt die Funktion `nil` zurück). Du kannst entweder explizit `return` verwenden oder die Schleife in eine Listen-Comprehension umwandeln.
@@ -2971,18 +1544,6 @@ print func_a! -- gibt nil aus
2971print func_b! -- gibt Tabellenobjekt aus 1544print func_b! -- gibt Tabellenobjekt aus
2972``` 1545```
2973 1546
2974<YueDisplay>
2975
2976```yue
2977func_a = -> for i = 1, 10 do print i
2978func_b = -> return for i = 1, 10 do i
2979
2980print func_a! -- gibt nil aus
2981print func_b! -- gibt Tabellenobjekt aus
2982```
2983
2984</YueDisplay>
2985
2986Das verhindert die unnötige Erstellung von Tabellen in Funktionen, die die Ergebnisse der Schleife nicht zurückgeben müssen. 1547Das verhindert die unnötige Erstellung von Tabellen in Funktionen, die die Ergebnisse der Schleife nicht zurückgeben müssen.
2987 1548
2988# Continue 1549# Continue
@@ -2997,18 +1558,6 @@ while i < 10
2997 print i 1558 print i
2998``` 1559```
2999 1560
3000<YueDisplay>
3001
3002```yue
3003i = 0
3004while i < 10
3005 i += 1
3006 continue if i % 2 == 0
3007 print i
3008```
3009
3010</YueDisplay>
3011
3012`continue` kann auch mit Schleifenausdrücken verwendet werden, um zu verhindern, dass diese Iteration in das Ergebnis akkumuliert wird. Dieses Beispiel filtert die Array-Tabelle auf gerade Zahlen: 1561`continue` kann auch mit Schleifenausdrücken verwendet werden, um zu verhindern, dass diese Iteration in das Ergebnis akkumuliert wird. Dieses Beispiel filtert die Array-Tabelle auf gerade Zahlen:
3013 1562
3014```yuescript 1563```yuescript
@@ -3018,17 +1567,6 @@ odds = for x in *my_numbers
3018 x 1567 x
3019``` 1568```
3020 1569
3021<YueDisplay>
3022
3023```yue
3024my_numbers = [1, 2, 3, 4, 5, 6]
3025odds = for x in *my_numbers
3026 continue if x % 2 == 1
3027 x
3028```
3029
3030</YueDisplay>
3031
3032# Switch 1570# Switch
3033 1571
3034Die `switch`-Anweisung ist eine Kurzform für eine Reihe von `if`-Anweisungen, die gegen denselben Wert prüfen. Der Wert wird nur einmal ausgewertet. Wie bei `if` kann `switch` einen `else`-Block haben, wenn keine Übereinstimmung gefunden wird. Verglichen wird mit dem Operator `==`. In einer `switch`-Anweisung kannst du auch eine Zuweisung verwenden, um den temporären Wert zu speichern. 1572Die `switch`-Anweisung ist eine Kurzform für eine Reihe von `if`-Anweisungen, die gegen denselben Wert prüfen. Der Wert wird nur einmal ausgewertet. Wie bei `if` kann `switch` einen `else`-Block haben, wenn keine Übereinstimmung gefunden wird. Verglichen wird mit dem Operator `==`. In einer `switch`-Anweisung kannst du auch eine Zuweisung verwenden, um den temporären Wert zu speichern.
@@ -3043,20 +1581,6 @@ switch name := "Dan"
3043 print "Ich kenne dich nicht mit dem Namen #{name}" 1581 print "Ich kenne dich nicht mit dem Namen #{name}"
3044``` 1582```
3045 1583
3046<YueDisplay>
3047
3048```yue
3049switch name := "Dan"
3050 when "Robert"
3051 print "Du bist Robert"
3052 when "Dan", "Daniel"
3053 print "Dein Name ist Dan"
3054 else
3055 print "Ich kenne dich nicht mit dem Namen #{name}"
3056```
3057
3058</YueDisplay>
3059
3060Eine `when`-Klausel kann mehrere Werte prüfen, indem sie kommasepariert aufgelistet werden. 1584Eine `when`-Klausel kann mehrere Werte prüfen, indem sie kommasepariert aufgelistet werden.
3061 1585
3062`switch` kann auch als Ausdruck verwendet werden. Hier wird das Ergebnis der `switch`-Anweisung einer Variable zugewiesen: 1586`switch` kann auch als Ausdruck verwendet werden. Hier wird das Ergebnis der `switch`-Anweisung einer Variable zugewiesen:
@@ -3072,21 +1596,6 @@ next_number = switch b
3072 error "so hoch kann ich nicht zählen!" 1596 error "so hoch kann ich nicht zählen!"
3073``` 1597```
3074 1598
3075<YueDisplay>
3076
3077```yue
3078b = 1
3079next_number = switch b
3080 when 1
3081 2
3082 when 2
3083 3
3084 else
3085 error "so hoch kann ich nicht zählen!"
3086```
3087
3088</YueDisplay>
3089
3090Du kannst das Schlüsselwort `then` verwenden, um einen `when`-Block in einer Zeile zu schreiben. Für den `else`-Block braucht es kein zusätzliches Schlüsselwort. 1599Du kannst das Schlüsselwort `then` verwenden, um einen `when`-Block in einer Zeile zu schreiben. Für den `else`-Block braucht es kein zusätzliches Schlüsselwort.
3091 1600
3092```yuescript 1601```yuescript
@@ -3096,17 +1605,6 @@ msg = switch math.random(1, 5)
3096 else "nicht so viel Glück" 1605 else "nicht so viel Glück"
3097``` 1606```
3098 1607
3099<YueDisplay>
3100
3101```yue
3102msg = switch math.random(1, 5)
3103 when 1 then "Du hast Glück"
3104 when 2 then "Du hast fast Glück"
3105 else "nicht so viel Glück"
3106```
3107
3108</YueDisplay>
3109
3110Wenn du eine Einrückung weniger möchtest, kannst du die erste `when`-Klausel in die Startzeile der Anweisung setzen und alle weiteren Klauseln mit einer Einrückung weniger schreiben. 1608Wenn du eine Einrückung weniger möchtest, kannst du die erste `when`-Klausel in die Startzeile der Anweisung setzen und alle weiteren Klauseln mit einer Einrückung weniger schreiben.
3111 1609
3112```yuescript 1610```yuescript
@@ -3122,23 +1620,6 @@ else
3122 print "nicht so viel Glück" 1620 print "nicht so viel Glück"
3123``` 1621```
3124 1622
3125<YueDisplay>
3126
3127```yue
3128switch math.random(1, 5)
3129 when 1
3130 print "Du hast Glück" -- zwei Einrückungen
3131 else
3132 print "nicht so viel Glück"
3133
3134switch math.random(1, 5) when 1
3135 print "Du hast Glück" -- eine Einrückung
3136else
3137 print "nicht so viel Glück"
3138```
3139
3140</YueDisplay>
3141
3142Beachte die Reihenfolge des Case-Vergleichsausdrucks. Der Case-Ausdruck steht auf der linken Seite. Das kann nützlich sein, wenn der Case-Ausdruck die Vergleichslogik über eine `__eq`-Metamethod selbst definiert. 1623Beachte die Reihenfolge des Case-Vergleichsausdrucks. Der Case-Ausdruck steht auf der linken Seite. Das kann nützlich sein, wenn der Case-Ausdruck die Vergleichslogik über eine `__eq`-Metamethod selbst definiert.
3143 1624
3144## Tabellen-Matching 1625## Tabellen-Matching
@@ -3160,25 +1641,6 @@ for item in *items
3160 print "Größe #{width}, #{height}" 1641 print "Größe #{width}, #{height}"
3161``` 1642```
3162 1643
3163<YueDisplay>
3164
3165```yue
3166items =
3167 * x: 100
3168 y: 200
3169 * width: 300
3170 height: 400
3171
3172for item in *items
3173 switch item
3174 when :x, :y
3175 print "Vec2 #{x}, #{y}"
3176 when :width, :height
3177 print "Größe #{width}, #{height}"
3178```
3179
3180</YueDisplay>
3181
3182Du kannst Standardwerte verwenden, um bestimmte Felder optional zu destrukturieren. 1644Du kannst Standardwerte verwenden, um bestimmte Felder optional zu destrukturieren.
3183 1645
3184```yuescript 1646```yuescript
@@ -3191,20 +1653,6 @@ switch item
3191 print "Vec2 #{x}, #{y}" -- Tabellen-Destrukturierung greift trotzdem 1653 print "Vec2 #{x}, #{y}" -- Tabellen-Destrukturierung greift trotzdem
3192``` 1654```
3193 1655
3194<YueDisplay>
3195
3196```yue
3197item = {}
3198
3199{pos: {:x = 50, :y = 200}} = item -- Fehler: Versuch, einen nil-Wert zu indexieren (Feld 'pos')
3200
3201switch item
3202 when {pos: {:x = 50, :y = 200}}
3203 print "Vec2 #{x}, #{y}" -- Tabellen-Destrukturierung greift trotzdem
3204```
3205
3206</YueDisplay>
3207
3208Du kannst auch gegen Array-Elemente, Tabellenfelder und sogar verschachtelte Strukturen mit Array- oder Tabellenliteralen matchen. 1656Du kannst auch gegen Array-Elemente, Tabellenfelder und sogar verschachtelte Strukturen mit Array- oder Tabellenliteralen matchen.
3209 1657
3210Matchen gegen Array-Elemente. 1658Matchen gegen Array-Elemente.
@@ -3219,20 +1667,6 @@ switch tb
3219 print "1, 2, #{b}" 1667 print "1, 2, #{b}"
3220``` 1668```
3221 1669
3222<YueDisplay>
3223
3224```yue
3225switch tb
3226 when [1, 2, 3]
3227 print "1, 2, 3"
3228 when [1, b, 3]
3229 print "1, #{b}, 3"
3230 when [1, 2, b = 3] -- b hat einen Standardwert
3231 print "1, 2, #{b}"
3232```
3233
3234</YueDisplay>
3235
3236Matchen gegen Tabellenfelder mit Destructuring. 1670Matchen gegen Tabellenfelder mit Destructuring.
3237 1671
3238```yuescript 1672```yuescript
@@ -3245,20 +1679,6 @@ switch tb
3245 print "ungültig" 1679 print "ungültig"
3246``` 1680```
3247 1681
3248<YueDisplay>
3249
3250```yue
3251switch tb
3252 when success: true, :result
3253 print "Erfolg", result
3254 when success: false
3255 print "fehlgeschlagen", result
3256 else
3257 print "ungültig"
3258```
3259
3260</YueDisplay>
3261
3262Matchen gegen verschachtelte Tabellenstrukturen. 1682Matchen gegen verschachtelte Tabellenstrukturen.
3263 1683
3264```yuescript 1684```yuescript
@@ -3271,20 +1691,6 @@ switch tb
3271 print "ungültig" 1691 print "ungültig"
3272``` 1692```
3273 1693
3274<YueDisplay>
3275
3276```yue
3277switch tb
3278 when data: {type: "success", :content}
3279 print "Erfolg", content
3280 when data: {type: "error", :content}
3281 print "fehlgeschlagen", content
3282 else
3283 print "ungültig"
3284```
3285
3286</YueDisplay>
3287
3288Matchen gegen Array von Tabellen. 1694Matchen gegen Array von Tabellen.
3289 1695
3290```yuescript 1696```yuescript
@@ -3298,21 +1704,6 @@ switch tb
3298 print "getroffen", fourth 1704 print "getroffen", fourth
3299``` 1705```
3300 1706
3301<YueDisplay>
3302
3303```yue
3304switch tb
3305 when [
3306 {a: 1, b: 2}
3307 {a: 3, b: 4}
3308 {a: 5, b: 6}
3309 fourth
3310 ]
3311 print "getroffen", fourth
3312```
3313
3314</YueDisplay>
3315
3316Matchen gegen eine Liste und einen Bereich von Elementen erfassen. 1707Matchen gegen eine Liste und einen Bereich von Elementen erfassen.
3317 1708
3318```yuescript 1709```yuescript
@@ -3324,19 +1715,6 @@ switch segments
3324 print "Aktion:", action -- gibt aus: "view" 1715 print "Aktion:", action -- gibt aus: "view"
3325``` 1716```
3326 1717
3327<YueDisplay>
3328
3329```yue
3330segments = ["admin", "users", "logs", "view"]
3331switch segments
3332 when [...groups, resource, action]
3333 print "Gruppe:", groups -- gibt aus: {"admin", "users"}
3334 print "Ressource:", resource -- gibt aus: "logs"
3335 print "Aktion:", action -- gibt aus: "view"
3336```
3337
3338</YueDisplay>
3339
3340# While-Schleife 1718# While-Schleife
3341 1719
3342Die `while`-Schleife gibt es ebenfalls in vier Variationen: 1720Die `while`-Schleife gibt es ebenfalls in vier Variationen:
@@ -3350,19 +1728,6 @@ while i > 0
3350while running == true do my_function! 1728while running == true do my_function!
3351``` 1729```
3352 1730
3353<YueDisplay>
3354
3355```yue
3356i = 10
3357while i > 0
3358 print i
3359 i -= 1
3360
3361while running == true do my_function!
3362```
3363
3364</YueDisplay>
3365
3366```yuescript 1731```yuescript
3367i = 10 1732i = 10
3368until i == 0 1733until i == 0
@@ -3372,18 +1737,6 @@ until i == 0
3372until running == false do my_function! 1737until running == false do my_function!
3373``` 1738```
3374 1739
3375<YueDisplay>
3376
3377```yue
3378i = 10
3379until i == 0
3380 print i
3381 i -= 1
3382until running == false do my_function!
3383```
3384
3385</YueDisplay>
3386
3387Wie bei `for`-Schleifen kann die `while`-Schleife auch als Ausdruck verwendet werden. `while`- und `until`-Ausdrücke unterstützen `break` mit mehreren Rückgabewerten. 1740Wie bei `for`-Schleifen kann die `while`-Schleife auch als Ausdruck verwendet werden. `while`- und `until`-Ausdrücke unterstützen `break` mit mehreren Rückgabewerten.
3388 1741
3389```yuescript 1742```yuescript
@@ -3392,16 +1745,6 @@ value, doubled = while true
3392 break n, n * 2 if n > 10 1745 break n, n * 2 if n > 10
3393``` 1746```
3394 1747
3395<YueDisplay>
3396
3397```yue
3398value, doubled = while true
3399 n = get_next!
3400 break n, n * 2 if n > 10
3401```
3402
3403</YueDisplay>
3404
3405Damit eine Funktion den akkumulierten Wert einer `while`-Schleife zurückgibt, muss die Anweisung explizit mit `return` zurückgegeben werden. 1748Damit eine Funktion den akkumulierten Wert einer `while`-Schleife zurückgibt, muss die Anweisung explizit mit `return` zurückgegeben werden.
3406 1749
3407## Repeat-Schleife 1750## Repeat-Schleife
@@ -3416,18 +1759,6 @@ repeat
3416until i == 0 1759until i == 0
3417``` 1760```
3418 1761
3419<YueDisplay>
3420
3421```yue
3422i = 10
3423repeat
3424 print i
3425 i -= 1
3426until i == 0
3427```
3428
3429</YueDisplay>
3430
3431`repeat`-Ausdrücke unterstützen ebenfalls `break` mit mehreren Rückgabewerten: 1762`repeat`-Ausdrücke unterstützen ebenfalls `break` mit mehreren Rückgabewerten:
3432 1763
3433```yuescript 1764```yuescript
@@ -3438,18 +1769,6 @@ value, scaled = repeat
3438until false 1769until false
3439``` 1770```
3440 1771
3441<YueDisplay>
3442
3443```yue
3444i = 1
3445value, scaled = repeat
3446 break i, i * 100 if i > 3
3447 i += 1
3448until false
3449```
3450
3451</YueDisplay>
3452
3453# Funktions-Stubs 1772# Funktions-Stubs
3454 1773
3455Es ist üblich, eine Funktion eines Objekts als Wert weiterzureichen, z. B. eine Instanzmethode als Callback. Wenn die Funktion das Objekt, auf dem sie arbeitet, als erstes Argument erwartet, musst du dieses Objekt irgendwie mit der Funktion bündeln, damit sie korrekt aufgerufen werden kann. 1774Es ist üblich, eine Funktion eines Objekts als Wert weiterzureichen, z. B. eine Instanzmethode als Callback. Wenn die Funktion das Objekt, auf dem sie arbeitet, als erstes Argument erwartet, musst du dieses Objekt irgendwie mit der Funktion bündeln, damit sie korrekt aufgerufen werden kann.
@@ -3477,29 +1796,6 @@ run_callback my_object.write
3477run_callback my_object\write 1796run_callback my_object\write
3478``` 1797```
3479 1798
3480<YueDisplay>
3481
3482```yue
3483my_object = {
3484 value: 1000
3485 write: => print "der Wert:", @value
3486}
3487
3488run_callback = (func) ->
3489 print "Callback wird ausgeführt..."
3490 func!
3491
3492-- das funktioniert nicht:
3493-- die Funktion darf keine Referenz auf my_object haben
3494run_callback my_object.write
3495
3496-- Funktions-Stub-Syntax
3497-- bindet das Objekt in eine neue Funktion ein
3498run_callback my_object\write
3499```
3500
3501</YueDisplay>
3502
3503# Backcalls 1799# Backcalls
3504 1800
3505Backcalls werden verwendet, um Callbacks zu entkoppeln (unnesting). Sie werden mit Pfeilen nach links definiert und füllen standardmäßig als letzter Parameter einen Funktionsaufruf. Die Syntax ist weitgehend wie bei normalen Pfeilfunktionen, nur dass der Pfeil in die andere Richtung zeigt und der Funktionskörper keine Einrückung benötigt. 1801Backcalls werden verwendet, um Callbacks zu entkoppeln (unnesting). Sie werden mit Pfeilen nach links definiert und füllen standardmäßig als letzter Parameter einen Funktionsaufruf. Die Syntax ist weitgehend wie bei normalen Pfeilfunktionen, nur dass der Pfeil in die andere Richtung zeigt und der Funktionskörper keine Einrückung benötigt.
@@ -3509,15 +1805,6 @@ x <- f
3509print "hallo" .. x 1805print "hallo" .. x
3510``` 1806```
3511 1807
3512<YueDisplay>
3513
3514```yue
3515x <- f
3516print "hallo" .. x
3517```
3518
3519</YueDisplay>
3520
3521Fat-Arrow-Funktionen sind ebenfalls verfügbar. 1808Fat-Arrow-Funktionen sind ebenfalls verfügbar.
3522 1809
3523```yuescript 1810```yuescript
@@ -3525,15 +1812,6 @@ Fat-Arrow-Funktionen sind ebenfalls verfügbar.
3525print @value 1812print @value
3526``` 1813```
3527 1814
3528<YueDisplay>
3529
3530```yue
3531<= f
3532print @value
3533```
3534
3535</YueDisplay>
3536
3537Du kannst einen Platzhalter angeben, an welcher Stelle die Backcall-Funktion als Parameter eingesetzt werden soll. 1815Du kannst einen Platzhalter angeben, an welcher Stelle die Backcall-Funktion als Parameter eingesetzt werden soll.
3538 1816
3539```yuescript 1817```yuescript
@@ -3541,15 +1819,6 @@ Du kannst einen Platzhalter angeben, an welcher Stelle die Backcall-Funktion als
3541x * 2 1819x * 2
3542``` 1820```
3543 1821
3544<YueDisplay>
3545
3546```yue
3547(x) <- map _, [1, 2, 3]
3548x * 2
3549```
3550
3551</YueDisplay>
3552
3553Wenn du nach deinen Backcalls weiteren Code haben willst, kannst du sie mit einem `do`-Statement absetzen. Bei Nicht-Fat-Arrow-Funktionen können die Klammern weggelassen werden. 1822Wenn du nach deinen Backcalls weiteren Code haben willst, kannst du sie mit einem `do`-Statement absetzen. Bei Nicht-Fat-Arrow-Funktionen können die Klammern weggelassen werden.
3554 1823
3555```yuescript 1824```yuescript
@@ -3561,19 +1830,6 @@ result, msg = do
3561print result, msg 1830print result, msg
3562``` 1831```
3563 1832
3564<YueDisplay>
3565
3566```yue
3567result, msg = do
3568 data <- readAsync "dateiname.txt"
3569 print data
3570 info <- processAsync data
3571 check info
3572print result, msg
3573```
3574
3575</YueDisplay>
3576
3577# Funktionsliterale 1833# Funktionsliterale
3578 1834
3579Alle Funktionen werden mit einem Funktionsausdruck erstellt. Eine einfache Funktion wird mit dem Pfeil **->** notiert. 1835Alle Funktionen werden mit einem Funktionsausdruck erstellt. Eine einfache Funktion wird mit dem Pfeil **->** notiert.
@@ -3583,15 +1839,6 @@ my_function = ->
3583my_function() -- leere Funktion aufrufen 1839my_function() -- leere Funktion aufrufen
3584``` 1840```
3585 1841
3586<YueDisplay>
3587
3588```yue
3589my_function = ->
3590my_function() -- leere Funktion aufrufen
3591```
3592
3593</YueDisplay>
3594
3595Der Funktionskörper kann entweder eine einzelne Anweisung direkt nach dem Pfeil sein oder aus mehreren Anweisungen bestehen, die in den folgenden Zeilen eingerückt werden: 1842Der Funktionskörper kann entweder eine einzelne Anweisung direkt nach dem Pfeil sein oder aus mehreren Anweisungen bestehen, die in den folgenden Zeilen eingerückt werden:
3596 1843
3597```yuescript 1844```yuescript
@@ -3602,18 +1849,6 @@ func_b = ->
3602 print "Der Wert:", value 1849 print "Der Wert:", value
3603``` 1850```
3604 1851
3605<YueDisplay>
3606
3607```yue
3608func_a = -> print "Hallo Welt"
3609
3610func_b = ->
3611 value = 100
3612 print "Der Wert:", value
3613```
3614
3615</YueDisplay>
3616
3617Wenn eine Funktion keine Argumente hat, kann sie mit dem `!`-Operator statt leerer Klammern aufgerufen werden. Der `!`-Aufruf ist die bevorzugte Art, Funktionen ohne Argumente aufzurufen. 1852Wenn eine Funktion keine Argumente hat, kann sie mit dem `!`-Operator statt leerer Klammern aufgerufen werden. Der `!`-Aufruf ist die bevorzugte Art, Funktionen ohne Argumente aufzurufen.
3618 1853
3619```yuescript 1854```yuescript
@@ -3621,29 +1856,12 @@ func_a!
3621func_b() 1856func_b()
3622``` 1857```
3623 1858
3624<YueDisplay>
3625
3626```yue
3627func_a!
3628func_b()
3629```
3630
3631</YueDisplay>
3632
3633Funktionen mit Argumenten werden erstellt, indem der Pfeil von einer Argumentliste in Klammern eingeleitet wird: 1859Funktionen mit Argumenten werden erstellt, indem der Pfeil von einer Argumentliste in Klammern eingeleitet wird:
3634 1860
3635```yuescript 1861```yuescript
3636sum = (x, y) -> print "Summe", x + y 1862sum = (x, y) -> print "Summe", x + y
3637``` 1863```
3638 1864
3639<YueDisplay>
3640
3641```yue
3642sum = (x, y) -> print "Summe", x + y
3643```
3644
3645</YueDisplay>
3646
3647Funktionen können aufgerufen werden, indem die Argumente hinter dem Namen eines Ausdrucks stehen, der zu einer Funktion evaluiert. Beim Verketten mehrerer Funktionsaufrufe werden die Argumente der nächstliegenden Funktion links zugeordnet. 1865Funktionen können aufgerufen werden, indem die Argumente hinter dem Namen eines Ausdrucks stehen, der zu einer Funktion evaluiert. Beim Verketten mehrerer Funktionsaufrufe werden die Argumente der nächstliegenden Funktion links zugeordnet.
3648 1866
3649```yuescript 1867```yuescript
@@ -3653,31 +1871,12 @@ print sum 10, 20
3653a b c "a", "b", "c" 1871a b c "a", "b", "c"
3654``` 1872```
3655 1873
3656<YueDisplay>
3657
3658```yue
3659sum 10, 20
3660print sum 10, 20
3661
3662a b c "a", "b", "c"
3663```
3664
3665</YueDisplay>
3666
3667Um Mehrdeutigkeiten beim Aufruf zu vermeiden, können die Argumente auch in Klammern gesetzt werden. Das ist hier nötig, damit die richtigen Argumente an die richtigen Funktionen gehen. 1874Um Mehrdeutigkeiten beim Aufruf zu vermeiden, können die Argumente auch in Klammern gesetzt werden. Das ist hier nötig, damit die richtigen Argumente an die richtigen Funktionen gehen.
3668 1875
3669```yuescript 1876```yuescript
3670print "x:", sum(10, 20), "y:", sum(30, 40) 1877print "x:", sum(10, 20), "y:", sum(30, 40)
3671``` 1878```
3672 1879
3673<YueDisplay>
3674
3675```yue
3676print "x:", sum(10, 20), "y:", sum(30, 40)
3677```
3678
3679</YueDisplay>
3680
3681Zwischen öffnender Klammer und Funktionsname darf kein Leerzeichen stehen. 1880Zwischen öffnender Klammer und Funktionsname darf kein Leerzeichen stehen.
3682 1881
3683Funktionen wandeln die letzte Anweisung im Funktionskörper in ein `return` um. Das nennt sich implizites Return: 1882Funktionen wandeln die letzte Anweisung im Funktionskörper in ein `return` um. Das nennt sich implizites Return:
@@ -3687,29 +1886,12 @@ sum = (x, y) -> x + y
3687print "Die Summe ist ", sum 10, 20 1886print "Die Summe ist ", sum 10, 20
3688``` 1887```
3689 1888
3690<YueDisplay>
3691
3692```yue
3693sum = (x, y) -> x + y
3694print "Die Summe ist ", sum 10, 20
3695```
3696
3697</YueDisplay>
3698
3699Wenn du explizit zurückgeben willst, verwende `return`: 1889Wenn du explizit zurückgeben willst, verwende `return`:
3700 1890
3701```yuescript 1891```yuescript
3702sum = (x, y) -> return x + y 1892sum = (x, y) -> return x + y
3703``` 1893```
3704 1894
3705<YueDisplay>
3706
3707```yue
3708sum = (x, y) -> return x + y
3709```
3710
3711</YueDisplay>
3712
3713Wie in Lua können Funktionen mehrere Werte zurückgeben. Die letzte Anweisung muss eine Liste von Werten sein, getrennt durch Kommas: 1895Wie in Lua können Funktionen mehrere Werte zurückgeben. Die letzte Anweisung muss eine Liste von Werten sein, getrennt durch Kommas:
3714 1896
3715```yuescript 1897```yuescript
@@ -3717,15 +1899,6 @@ mystery = (x, y) -> x + y, x - y
3717a, b = mystery 10, 20 1899a, b = mystery 10, 20
3718``` 1900```
3719 1901
3720<YueDisplay>
3721
3722```yue
3723mystery = (x, y) -> x + y, x - y
3724a, b = mystery 10, 20
3725```
3726
3727</YueDisplay>
3728
3729## Fat Arrows 1902## Fat Arrows
3730 1903
3731Da es in Lua üblich ist, beim Methodenaufruf ein Objekt als erstes Argument zu übergeben, gibt es eine spezielle Syntax zum Erstellen von Funktionen, die automatisch ein `self`-Argument enthalten. 1904Da es in Lua üblich ist, beim Methodenaufruf ein Objekt als erstes Argument zu übergeben, gibt es eine spezielle Syntax zum Erstellen von Funktionen, die automatisch ein `self`-Argument enthalten.
@@ -3734,14 +1907,6 @@ Da es in Lua üblich ist, beim Methodenaufruf ein Objekt als erstes Argument zu
3734func = (num) => @value + num 1907func = (num) => @value + num
3735``` 1908```
3736 1909
3737<YueDisplay>
3738
3739```yue
3740func = (num) => @value + num
3741```
3742
3743</YueDisplay>
3744
3745## Standardwerte für Argumente 1910## Standardwerte für Argumente
3746 1911
3747Es ist möglich, Standardwerte für Funktionsargumente anzugeben. Ein Argument gilt als leer, wenn sein Wert `nil` ist. Alle `nil`-Argumente mit Standardwert werden vor Ausführung des Funktionskörpers ersetzt. 1912Es ist möglich, Standardwerte für Funktionsargumente anzugeben. Ein Argument gilt als leer, wenn sein Wert `nil` ist. Alle `nil`-Argumente mit Standardwert werden vor Ausführung des Funktionskörpers ersetzt.
@@ -3752,16 +1917,6 @@ my_function = (name = "etwas", height = 100) ->
3752 print "Meine Größe ist", height 1917 print "Meine Größe ist", height
3753``` 1918```
3754 1919
3755<YueDisplay>
3756
3757```yue
3758my_function = (name = "etwas", height = 100) ->
3759 print "Hallo, ich bin", name
3760 print "Meine Größe ist", height
3761```
3762
3763</YueDisplay>
3764
3765Der Ausdruck für den Standardwert wird im Funktionskörper in der Reihenfolge der Argumentdeklarationen ausgewertet. Daher können Standardwerte auf zuvor deklarierte Argumente zugreifen. 1920Der Ausdruck für den Standardwert wird im Funktionskörper in der Reihenfolge der Argumentdeklarationen ausgewertet. Daher können Standardwerte auf zuvor deklarierte Argumente zugreifen.
3766 1921
3767```yuescript 1922```yuescript
@@ -3769,15 +1924,6 @@ some_args = (x = 100, y = x + 1000) ->
3769 print x + y 1924 print x + y
3770``` 1925```
3771 1926
3772<YueDisplay>
3773
3774```yue
3775some_args = (x = 100, y = x + 1000) ->
3776 print x + y
3777```
3778
3779</YueDisplay>
3780
3781## Hinweise 1927## Hinweise
3782 1928
3783Aufgrund der ausdrucksstarken, klammerlosen Funktionsaufrufe müssen einige Einschränkungen gelten, um Parsing-Mehrdeutigkeiten mit Leerraum zu vermeiden. 1929Aufgrund der ausdrucksstarken, klammerlosen Funktionsaufrufe müssen einige Einschränkungen gelten, um Parsing-Mehrdeutigkeiten mit Leerraum zu vermeiden.
@@ -3791,17 +1937,6 @@ c = x -y
3791d = x- z 1937d = x- z
3792``` 1938```
3793 1939
3794<YueDisplay>
3795
3796```yue
3797a = x - 10
3798b = x-10
3799c = x -y
3800d = x- z
3801```
3802
3803</YueDisplay>
3804
3805Die Präzedenz des ersten Arguments eines Funktionsaufrufs kann mit Leerraum gesteuert werden, wenn das Argument ein String-Literal ist. In Lua lässt man bei Aufrufen mit einem einzelnen String- oder Tabellenliteral häufig die Klammern weg. 1940Die Präzedenz des ersten Arguments eines Funktionsaufrufs kann mit Leerraum gesteuert werden, wenn das Argument ein String-Literal ist. In Lua lässt man bei Aufrufen mit einem einzelnen String- oder Tabellenliteral häufig die Klammern weg.
3806 1941
3807Wenn kein Leerzeichen zwischen Variable und String-Literal steht, hat der Funktionsaufruf Vorrang vor nachfolgenden Ausdrücken. In dieser Form können keine weiteren Argumente übergeben werden. 1942Wenn kein Leerzeichen zwischen Variable und String-Literal steht, hat der Funktionsaufruf Vorrang vor nachfolgenden Ausdrücken. In dieser Form können keine weiteren Argumente übergeben werden.
@@ -3813,15 +1948,6 @@ x = func"hallo" + 100
3813y = func "hallo" + 100 1948y = func "hallo" + 100
3814``` 1949```
3815 1950
3816<YueDisplay>
3817
3818```yue
3819x = func"hallo" + 100
3820y = func "hallo" + 100
3821```
3822
3823</YueDisplay>
3824
3825## Mehrzeilige Argumente 1951## Mehrzeilige Argumente
3826 1952
3827Wenn Funktionsaufrufe viele Argumente haben, ist es praktisch, die Argumentliste auf mehrere Zeilen zu verteilen. Wegen der whitespace-sensitiven Natur der Sprache muss man dabei sorgfältig sein. 1953Wenn Funktionsaufrufe viele Argumente haben, ist es praktisch, die Argumentliste auf mehrere Zeilen zu verteilen. Wegen der whitespace-sensitiven Natur der Sprache muss man dabei sorgfältig sein.
@@ -3838,20 +1964,6 @@ cool_func 1, 2,
3838 7, 8 1964 7, 8
3839``` 1965```
3840 1966
3841<YueDisplay>
3842
3843```yue
3844my_func 5, 4, 3,
3845 8, 9, 10
3846
3847cool_func 1, 2,
3848 3, 4,
3849 5, 6,
3850 7, 8
3851```
3852
3853</YueDisplay>
3854
3855Diese Art des Aufrufs kann verschachtelt werden. Die Einrückungsebene bestimmt, zu welcher Funktion die Argumente gehören. 1967Diese Art des Aufrufs kann verschachtelt werden. Die Einrückungsebene bestimmt, zu welcher Funktion die Argumente gehören.
3856 1968
3857```yuescript 1969```yuescript
@@ -3861,17 +1973,6 @@ my_func 5, 6, 7,
3861 5, 4 1973 5, 4
3862``` 1974```
3863 1975
3864<YueDisplay>
3865
3866```yue
3867my_func 5, 6, 7,
3868 6, another_func 6, 7, 8,
3869 9, 1, 2,
3870 5, 4
3871```
3872
3873</YueDisplay>
3874
3875Da Tabellen ebenfalls das Komma als Trennzeichen verwenden, hilft diese Einrückungssyntax dabei, Werte zur Argumentliste gehören zu lassen, statt zur Tabelle. 1976Da Tabellen ebenfalls das Komma als Trennzeichen verwenden, hilft diese Einrückungssyntax dabei, Werte zur Argumentliste gehören zu lassen, statt zur Tabelle.
3876 1977
3877```yuescript 1978```yuescript
@@ -3882,18 +1983,6 @@ x = [
3882] 1983]
3883``` 1984```
3884 1985
3885<YueDisplay>
3886
3887```yue
3888x = [
3889 1, 2, 3, 4, a_func 4, 5,
3890 5, 6,
3891 8, 9, 10
3892]
3893```
3894
3895</YueDisplay>
3896
3897Obwohl es selten ist: Du kannst Funktionsargumente tiefer einrücken, wenn du weißt, dass du später eine geringere Einrückungsebene verwenden wirst. 1986Obwohl es selten ist: Du kannst Funktionsargumente tiefer einrücken, wenn du weißt, dass du später eine geringere Einrückungsebene verwenden wirst.
3898 1987
3899```yuescript 1988```yuescript
@@ -3903,17 +1992,6 @@ y = [ my_func 1, 2, 3,
3903] 1992]
3904``` 1993```
3905 1994
3906<YueDisplay>
3907
3908```yue
3909y = [ my_func 1, 2, 3,
3910 4, 5,
3911 5, 6, 7
3912]
3913```
3914
3915</YueDisplay>
3916
3917Dasselbe lässt sich mit anderen Block-Statements wie Bedingungen machen. Wir können die Einrückungsebene verwenden, um zu bestimmen, zu welcher Anweisung ein Wert gehört: 1995Dasselbe lässt sich mit anderen Block-Statements wie Bedingungen machen. Wir können die Einrückungsebene verwenden, um zu bestimmen, zu welcher Anweisung ein Wert gehört:
3918 1996
3919```yuescript 1997```yuescript
@@ -3930,24 +2008,6 @@ if func 1, 2, 3,
3930 print "Ich bin innerhalb der if-Bedingung" 2008 print "Ich bin innerhalb der if-Bedingung"
3931``` 2009```
3932 2010
3933<YueDisplay>
3934
3935```yue
3936if func 1, 2, 3,
3937 "hallo",
3938 "Welt"
3939 print "hallo"
3940 print "Ich bin innerhalb der if-Bedingung"
3941
3942if func 1, 2, 3,
3943 "hallo",
3944 "Welt"
3945 print "hallo"
3946 print "Ich bin innerhalb der if-Bedingung"
3947```
3948
3949</YueDisplay>
3950
3951## Parameter-Destructuring 2011## Parameter-Destructuring
3952 2012
3953YueScript unterstützt jetzt Destructuring von Funktionsparametern, wenn das Argument ein Objekt ist. Es gibt zwei Formen von Destructuring-Tabellenliteralen: 2013YueScript unterstützt jetzt Destructuring von Funktionsparametern, wenn das Argument ein Objekt ist. Es gibt zwei Formen von Destructuring-Tabellenliteralen:
@@ -3968,23 +2028,6 @@ arg1 = {a: 0}
3968f2 arg1, arg2 2028f2 arg1, arg2
3969``` 2029```
3970 2030
3971<YueDisplay>
3972
3973```yue
3974f1 = (:a, :b, :c) ->
3975 print a, b, c
3976
3977f1 a: 1, b: "2", c: {}
3978
3979f2 = ({a: a1 = 123, :b = 'abc'}, c = {}) ->
3980print a1, b, c
3981
3982arg1 = {a: 0}
3983f2 arg1, arg2
3984```
3985
3986</YueDisplay>
3987
3988## Präfixiertes Return-Expression 2031## Präfixiertes Return-Expression
3989 2032
3990Wenn du mit tief verschachtelten Funktionskörpern arbeitest, kann es mühsam sein, die Lesbarkeit und Konsistenz des Rückgabewerts zu erhalten. Dafür führt YueScript die Syntax der **präfixierten Return-Expression** ein. Sie hat folgende Form: 2033Wenn du mit tief verschachtelten Funktionskörpern arbeitest, kann es mühsam sein, die Lesbarkeit und Konsistenz des Rückgabewerts zu erhalten. Dafür führt YueScript die Syntax der **präfixierten Return-Expression** ein. Sie hat folgende Form:
@@ -3998,19 +2041,6 @@ findFirstEven = (list): nil ->
3998 return sub 2041 return sub
3999``` 2042```
4000 2043
4001<YueDisplay>
4002
4003```yue
4004findFirstEven = (list): nil ->
4005 for item in *list
4006 if type(item) == "table"
4007 for sub in *item
4008 if sub % 2 == 0
4009 return sub
4010```
4011
4012</YueDisplay>
4013
4014Das ist äquivalent zu: 2044Das ist äquivalent zu:
4015 2045
4016```yuescript 2046```yuescript
@@ -4023,20 +2053,6 @@ findFirstEven = (list) ->
4023 nil 2053 nil
4024``` 2054```
4025 2055
4026<YueDisplay>
4027
4028```yue
4029findFirstEven = (list) ->
4030 for item in *list
4031 if type(item) == "table"
4032 for sub in *item
4033 if sub % 2 == 0
4034 return sub
4035 nil
4036```
4037
4038</YueDisplay>
4039
4040Der einzige Unterschied ist, dass du den finalen Rückgabeausdruck vor das `->`- oder `=>`-Token ziehen kannst, um den impliziten Rückgabewert der Funktion als letzte Anweisung zu kennzeichnen. So musst du selbst bei Funktionen mit mehreren verschachtelten Schleifen oder bedingten Zweigen kein abschließendes `return` am Ende des Funktionskörpers mehr schreiben, was die Logikstruktur klarer und leichter nachvollziehbar macht. 2056Der einzige Unterschied ist, dass du den finalen Rückgabeausdruck vor das `->`- oder `=>`-Token ziehen kannst, um den impliziten Rückgabewert der Funktion als letzte Anweisung zu kennzeichnen. So musst du selbst bei Funktionen mit mehreren verschachtelten Schleifen oder bedingten Zweigen kein abschließendes `return` am Ende des Funktionskörpers mehr schreiben, was die Logikstruktur klarer und leichter nachvollziehbar macht.
4041 2057
4042## Benannte Varargs 2058## Benannte Varargs
@@ -4065,32 +2081,6 @@ process = (...args) ->
4065process 1, nil, 3, nil, 5 2081process 1, nil, 3, nil, 5
4066``` 2082```
4067 2083
4068<YueDisplay>
4069
4070```yue
4071f = (...t) ->
4072 print "Anzahl der Argumente:", t.n
4073 print "Tabellenlänge:", #t
4074 for i = 1, t.n
4075 print t[i]
4076
4077f 1, 2, 3
4078f "a", "b", "c", "d"
4079f!
4080
4081-- Fälle mit nil-Werten behandeln
4082process = (...args) ->
4083 sum = 0
4084 for i = 1, args.n
4085 if args[i] != nil and type(args[i]) == "number"
4086 sum += args[i]
4087 sum
4088
4089process 1, nil, 3, nil, 5
4090```
4091
4092</YueDisplay>
4093
4094# Leerraum 2084# Leerraum
4095 2085
4096YueScript ist eine whitespace-sensible Sprache. Du musst bestimmte Code-Blöcke mit derselben Einrückung (Leerzeichen **' '** oder Tab **'\t'**) schreiben, z. B. Funktionskörper, Wertelisten und Kontrollblöcke. Ausdrücke mit unterschiedlichem Leerraum können unterschiedliche Bedeutungen haben. Ein Tab wird wie 4 Leerzeichen behandelt, aber es ist besser, Leerzeichen und Tabs nicht zu mischen. 2086YueScript ist eine whitespace-sensible Sprache. Du musst bestimmte Code-Blöcke mit derselben Einrückung (Leerzeichen **' '** oder Tab **'\t'**) schreiben, z. B. Funktionskörper, Wertelisten und Kontrollblöcke. Ausdrücke mit unterschiedlichem Leerraum können unterschiedliche Bedeutungen haben. Ein Tab wird wie 4 Leerzeichen behandelt, aber es ist besser, Leerzeichen und Tabs nicht zu mischen.
@@ -4103,14 +2093,6 @@ Eine Anweisung endet normalerweise an einem Zeilenumbruch. Du kannst auch ein Se
4103a = 1; b = 2; print a + b 2093a = 1; b = 2; print a + b
4104``` 2094```
4105 2095
4106<YueDisplay>
4107
4108```yue
4109a = 1; b = 2; print a + b
4110```
4111
4112</YueDisplay>
4113
4114## Mehrzeiliges Chaining 2096## Mehrzeiliges Chaining
4115 2097
4116Du kannst mehrzeilige, verkettete Funktionsaufrufe mit derselben Einrückung schreiben. 2098Du kannst mehrzeilige, verkettete Funktionsaufrufe mit derselben Einrückung schreiben.
@@ -4124,19 +2106,6 @@ Rx.Observable
4124 \subscribe print 2106 \subscribe print
4125``` 2107```
4126 2108
4127<YueDisplay>
4128
4129```yue
4130Rx.Observable
4131 .fromRange 1, 8
4132 \filter (x) -> x % 2 == 0
4133 \concat Rx.Observable.of 'who do we appreciate'
4134 \map (value) -> value .. '!'
4135 \subscribe print
4136```
4137
4138</YueDisplay>
4139
4140# Kommentare 2109# Kommentare
4141 2110
4142```yuescript 2111```yuescript
@@ -4152,23 +2121,6 @@ Alles okay.
4152func --[[Port]] 3000, --[[IP]] "192.168.1.1" 2121func --[[Port]] 3000, --[[IP]] "192.168.1.1"
4153``` 2122```
4154 2123
4155<YueDisplay>
4156
4157```yue
4158-- Ich bin ein Kommentar
4159
4160str = --[[
4161Dies ist ein mehrzeiliger Kommentar.
4162Alles okay.
4163]] strA \ -- Kommentar 1
4164 .. strB \ -- Kommentar 2
4165 .. strC
4166
4167func --[[Port]] 3000, --[[IP]] "192.168.1.1"
4168```
4169
4170</YueDisplay>
4171
4172# Attribute 2124# Attribute
4173 2125
4174Syntax-Unterstützung für Lua-5.4-Attribute. Du kannst weiterhin die Deklarationen `const` und `close` verwenden und erhältst Konstantenprüfung sowie Scoped-Callbacks, wenn du auf Lua-Versionen unter 5.4 zielst. 2126Syntax-Unterstützung für Lua-5.4-Attribute. Du kannst weiterhin die Deklarationen `const` und `close` verwenden und erhältst Konstantenprüfung sowie Scoped-Callbacks, wenn du auf Lua-Versionen unter 5.4 zielst.
@@ -4178,15 +2130,6 @@ const a = 123
4178close _ = <close>: -> print "Außerhalb des Gültigkeitsbereichs." 2130close _ = <close>: -> print "Außerhalb des Gültigkeitsbereichs."
4179``` 2131```
4180 2132
4181<YueDisplay>
4182
4183```yue
4184const a = 123
4185close _ = <close>: -> print "Außerhalb des Gültigkeitsbereichs."
4186```
4187
4188</YueDisplay>
4189
4190Du kannst Destructuring mit als konstant markierten Variablen verwenden. 2133Du kannst Destructuring mit als konstant markierten Variablen verwenden.
4191 2134
4192```yuescript 2135```yuescript
@@ -4194,15 +2137,6 @@ const {:a, :b, c, d} = tb
4194-- a = 1 2137-- a = 1
4195``` 2138```
4196 2139
4197<YueDisplay>
4198
4199```yue
4200const {:a, :b, c, d} = tb
4201-- a = 1
4202```
4203
4204</YueDisplay>
4205
4206Du kannst auch eine globale Variable als `const` deklarieren. 2140Du kannst auch eine globale Variable als `const` deklarieren.
4207 2141
4208```yuescript 2142```yuescript
@@ -4210,15 +2144,6 @@ global const Constant = 123
4210-- Constant = 1 2144-- Constant = 1
4211``` 2145```
4212 2146
4213<YueDisplay>
4214
4215```yue
4216global const Constant = 123
4217-- Constant = 1
4218```
4219
4220</YueDisplay>
4221
4222# Operatoren 2147# Operatoren
4223 2148
4224Alle binären und unären Operatoren von Lua sind verfügbar. Zusätzlich ist **!=** ein Alias für **~=**, und entweder **\*\* oder **::\*\* kann für verkettete Funktionsaufrufe wie `tb\func!` oder `tb::func!` verwendet werden. Außerdem bietet YueScript einige spezielle Operatoren für ausdrucksstärkeren Code. 2149Alle binären und unären Operatoren von Lua sind verfügbar. Zusätzlich ist **!=** ein Alias für **~=**, und entweder **\*\* oder **::\*\* kann für verkettete Funktionsaufrufe wie `tb\func!` oder `tb::func!` verwendet werden. Außerdem bietet YueScript einige spezielle Operatoren für ausdrucksstärkeren Code.
@@ -4228,15 +2153,6 @@ tb\func! if tb ~= nil
4228tb::func! if tb != nil 2153tb::func! if tb != nil
4229``` 2154```
4230 2155
4231<YueDisplay>
4232
4233```yue
4234tb\func! if tb ~= nil
4235tb::func! if tb != nil
4236```
4237
4238</YueDisplay>
4239
4240## Verkettete Vergleiche 2156## Verkettete Vergleiche
4241 2157
4242Vergleiche können beliebig verkettet werden: 2158Vergleiche können beliebig verkettet werden:
@@ -4250,19 +2166,6 @@ print 1 <= a <= 10
4250-- Ausgabe: true 2166-- Ausgabe: true
4251``` 2167```
4252 2168
4253<YueDisplay>
4254
4255```yue
4256print 1 < 2 <= 2 < 3 == 3 > 2 >= 1 == 1 < 3 != 5
4257-- Ausgabe: true
4258
4259a = 5
4260print 1 <= a <= 10
4261-- Ausgabe: true
4262```
4263
4264</YueDisplay>
4265
4266Beachte das Auswertungsverhalten verketteter Vergleiche: 2169Beachte das Auswertungsverhalten verketteter Vergleiche:
4267 2170
4268```yuescript 2171```yuescript
@@ -4288,33 +2191,6 @@ print v(1) > v(2) <= v(3)
4288]] 2191]]
4289``` 2192```
4290 2193
4291<YueDisplay>
4292
4293```yue
4294v = (x) ->
4295 print x
4296 x
4297
4298print v(1) < v(2) <= v(3)
4299--[[
4300 Ausgabe:
4301 2
4302 1
4303 3
4304 true
4305]]
4306
4307print v(1) > v(2) <= v(3)
4308--[[
4309 Ausgabe:
4310 2
4311 1
4312 false
4313]]
4314```
4315
4316</YueDisplay>
4317
4318Der mittlere Ausdruck wird nur einmal ausgewertet, nicht zweimal wie bei `v(1) < v(2) and v(2) <= v(3)`. Die Auswertungsreihenfolge in verketteten Vergleichen ist jedoch undefiniert. Es wird dringend empfohlen, in verketteten Vergleichen keine Ausdrücke mit Seiteneffekten (z. B. `print`) zu verwenden. Wenn Seiteneffekte nötig sind, sollte der Short-Circuit-Operator `and` explizit verwendet werden. 2194Der mittlere Ausdruck wird nur einmal ausgewertet, nicht zweimal wie bei `v(1) < v(2) and v(2) <= v(3)`. Die Auswertungsreihenfolge in verketteten Vergleichen ist jedoch undefiniert. Es wird dringend empfohlen, in verketteten Vergleichen keine Ausdrücke mit Seiteneffekten (z. B. `print`) zu verwenden. Wenn Seiteneffekte nötig sind, sollte der Short-Circuit-Operator `and` explizit verwendet werden.
4319 2195
4320## Tabellenerweiterung 2196## Tabellenerweiterung
@@ -4326,15 +2202,6 @@ tab = []
4326tab[] = "Wert" 2202tab[] = "Wert"
4327``` 2203```
4328 2204
4329<YueDisplay>
4330
4331```yue
4332tab = []
4333tab[] = "Wert"
4334```
4335
4336</YueDisplay>
4337
4338Du kannst auch den Spread-Operator `...` verwenden, um alle Elemente einer Liste an eine andere anzuhängen: 2205Du kannst auch den Spread-Operator `...` verwenden, um alle Elemente einer Liste an eine andere anzuhängen:
4339 2206
4340```yuescript 2207```yuescript
@@ -4344,17 +2211,6 @@ tbA[] = ...tbB
4344-- tbA ist jetzt [1, 2, 3, 4, 5, 6] 2211-- tbA ist jetzt [1, 2, 3, 4, 5, 6]
4345``` 2212```
4346 2213
4347<YueDisplay>
4348
4349```yue
4350tbA = [1, 2, 3]
4351tbB = [4, 5, 6]
4352tbA[] = ...tbB
4353-- tbA ist jetzt [1, 2, 3, 4, 5, 6]
4354```
4355
4356</YueDisplay>
4357
4358## Tabellen-Spread 2214## Tabellen-Spread
4359 2215
4360Du kannst Array-Tabellen oder Hash-Tabellen mit dem Spread-Operator `...` vor Ausdrücken in Tabellenliteralen zusammenführen. 2216Du kannst Array-Tabellen oder Hash-Tabellen mit dem Spread-Operator `...` vor Ausdrücken in Tabellenliteralen zusammenführen.
@@ -4376,27 +2232,6 @@ b = {4, 5, y: 1}
4376merge = {...a, ...b} 2232merge = {...a, ...b}
4377``` 2233```
4378 2234
4379<YueDisplay>
4380
4381```yue
4382parts =
4383 * "Schultern"
4384 * "Knie"
4385lyrics =
4386 * "Kopf"
4387 * ...parts
4388 * "und"
4389 * "Zehen"
4390
4391copy = {...other}
4392
4393a = {1, 2, 3, x: 1}
4394b = {4, 5, y: 1}
4395merge = {...a, ...b}
4396```
4397
4398</YueDisplay>
4399
4400## Umgekehrter Tabellenindex 2235## Umgekehrter Tabellenindex
4401 2236
4402Mit dem Operator **#** kannst du auf die letzten Elemente einer Tabelle zugreifen. 2237Mit dem Operator **#** kannst du auf die letzten Elemente einer Tabelle zugreifen.
@@ -4407,16 +2242,6 @@ second_last = data.items[#-1]
4407data.items[#] = 1 2242data.items[#] = 1
4408``` 2243```
4409 2244
4410<YueDisplay>
4411
4412```yue
4413last = data.items[#]
4414second_last = data.items[#-1]
4415data.items[#] = 1
4416```
4417
4418</YueDisplay>
4419
4420## Metatable 2245## Metatable
4421 2246
4422Der Operator **<>** kann als Abkürzung für Metatable-Manipulation verwendet werden. 2247Der Operator **<>** kann als Abkürzung für Metatable-Manipulation verwendet werden.
@@ -4441,26 +2266,6 @@ print d.value
4441close _ = <close>: -> print "Außerhalb des Gültigkeitsbereichs" 2266close _ = <close>: -> print "Außerhalb des Gültigkeitsbereichs"
4442``` 2267```
4443 2268
4444<YueDisplay>
4445
4446```yue
4447mt = {}
4448add = (right) => <>: mt, value: @value + right.value
4449mt.__add = add
4450
4451a = <>: mt, value: 1
4452 -- Feld mit gleichnamiger Variable setzen
4453b = :<add>, value: 2
4454c = <add>: mt.__add, value: 3
4455
4456d = a + b + c
4457print d.value
4458
4459close _ = <close>: -> print "Außerhalb des Gültigkeitsbereichs"
4460```
4461
4462</YueDisplay>
4463
4464### Metatable-Zugriff 2269### Metatable-Zugriff
4465 2270
4466Metatable mit **<>** oder einem von **<>** umschlossenen Metamethod-Namen aufrufen oder einen Ausdruck in **<>** schreiben. 2271Metatable mit **<>** oder einem von **<>** umschlossenen Metamethod-Namen aufrufen oder einen Ausdruck in **<>** schreiben.
@@ -4475,19 +2280,6 @@ tb.<> = __index: {item: "hallo"}
4475print tb.item 2280print tb.item
4476``` 2281```
4477 2282
4478<YueDisplay>
4479
4480```yue
4481-- erstellen mit Metatable, das das Feld "value" enthält
4482tb = <"value">: 123
4483tb.<index> = tb.<>
4484print tb.value
4485tb.<> = __index: {item: "hallo"}
4486print tb.item
4487```
4488
4489</YueDisplay>
4490
4491### Metatable-Destrukturierung 2283### Metatable-Destrukturierung
4492 2284
4493Destrukturiere Metatable mit Metamethoden-Schlüssel, der von **<>** umschlossen ist. 2285Destrukturiere Metatable mit Metamethoden-Schlüssel, der von **<>** umschlossen ist.
@@ -4497,15 +2289,6 @@ Destrukturiere Metatable mit Metamethoden-Schlüssel, der von **<>** umschlossen
4497print item, new, close, getter 2289print item, new, close, getter
4498``` 2290```
4499 2291
4500<YueDisplay>
4501
4502```yue
4503{item, :new, :<close>, <index>: getter} = tb
4504print item, new, close, getter
4505```
4506
4507</YueDisplay>
4508
4509## Existenz 2292## Existenz
4510 2293
4511Der Operator **?** kann in verschiedenen Kontexten verwendet werden, um die Existenz zu prüfen. 2294Der Operator **?** kann in verschiedenen Kontexten verwendet werden, um die Existenz zu prüfen.
@@ -4525,25 +2308,6 @@ with? io.open "test.txt", "w"
4525 \close! 2308 \close!
4526``` 2309```
4527 2310
4528<YueDisplay>
4529
4530```yue
4531func?!
4532print abc?["hello world"]?.xyz
4533
4534x = tab?.value
4535len = utf8?.len or string?.len or (o) -> #o
4536
4537if print and x?
4538 print x
4539
4540with? io.open "test.txt", "w"
4541 \write "hello"
4542 \close!
4543```
4544
4545</YueDisplay>
4546
4547## Piping 2311## Piping
4548 2312
4549Anstelle einer Reihe verschachtelter Funktionsaufrufe kannst du Werte mit dem Operator **|>** weiterleiten. 2313Anstelle einer Reihe verschachtelter Funktionsaufrufe kannst du Werte mit dem Operator **|>** weiterleiten.
@@ -4562,24 +2326,6 @@ readFile "example.txt"
4562 |> print 2326 |> print
4563``` 2327```
4564 2328
4565<YueDisplay>
4566
4567```yue
4568"hello" |> print
45691 |> print 2 -- Pipe-Element als erstes Argument einfügen
45702 |> print 1, _, 3 -- Pipe mit Platzhalter
4571
4572-- Pipe-Ausdruck über mehrere Zeilen
4573readFile "example.txt"
4574 |> extract language, {}
4575 |> parse language
4576 |> emit
4577 |> render
4578 |> print
4579```
4580
4581</YueDisplay>
4582
4583## Nil-Coalescing 2329## Nil-Coalescing
4584 2330
4585Der Nil-Coalescing-Operator **??** gibt den Wert des linken Operanden zurück, wenn er nicht **nil** ist; andernfalls wird der rechte Operand ausgewertet und sein Ergebnis zurückgegeben. Der **??**-Operator wertet seinen rechten Operanden nicht aus, wenn der linke Operand nicht nil ergibt. 2331Der Nil-Coalescing-Operator **??** gibt den Wert des linken Operanden zurück, wenn er nicht **nil** ist; andernfalls wird der rechte Operand ausgewertet und sein Ergebnis zurückgegeben. Der **??**-Operator wertet seinen rechten Operanden nicht aus, wenn der linke Operand nicht nil ergibt.
@@ -4592,17 +2338,6 @@ func a ?? {}
4592a ??= false 2338a ??= false
4593``` 2339```
4594 2340
4595<YueDisplay>
4596
4597```yue
4598local a, b, c, d
4599a = b ?? c ?? d
4600func a ?? {}
4601a ??= false
4602```
4603
4604</YueDisplay>
4605
4606## Implizites Objekt 2341## Implizites Objekt
4607 2342
4608Du kannst innerhalb eines Tabellenblocks eine Liste impliziter Strukturen schreiben, die mit dem Symbol **\*** oder **-** beginnt. Beim Erstellen eines impliziten Objekts müssen die Felder des Objekts dieselbe Einrückung haben. 2343Du kannst innerhalb eines Tabellenblocks eine Liste impliziter Strukturen schreiben, die mit dem Symbol **\*** oder **-** beginnt. Beim Erstellen eines impliziten Objekts müssen die Felder des Objekts dieselbe Einrückung haben.
@@ -4650,52 +2385,6 @@ tb =
4650 2385
4651``` 2386```
4652 2387
4653<YueDisplay>
4654
4655```yue
4656-- Zuweisung mit implizitem Objekt
4657list =
4658 * 1
4659 * 2
4660 * 3
4661
4662-- Funktionsaufruf mit implizitem Objekt
4663func
4664 * 1
4665 * 2
4666 * 3
4667
4668-- Rückgabe mit implizitem Objekt
4669f = ->
4670 return
4671 * 1
4672 * 2
4673 * 3
4674
4675-- Tabelle mit implizitem Objekt
4676tb =
4677 name: "abc"
4678
4679 values:
4680 - "a"
4681 - "b"
4682 - "c"
4683
4684 objects:
4685 - name: "a"
4686 value: 1
4687 func: => @value + 1
4688 tb:
4689 fieldA: 1
4690
4691 - name: "b"
4692 value: 2
4693 func: => @value + 2
4694 tb: { }
4695```
4696
4697</YueDisplay>
4698
4699# Literale 2388# Literale
4700 2389
4701Alle primitiven Literale in Lua können verwendet werden. Das gilt für Zahlen, Strings, Booleans und **nil**. 2390Alle primitiven Literale in Lua können verwendet werden. Das gilt für Zahlen, Strings, Booleans und **nil**.
@@ -4711,19 +2400,6 @@ some_string = "Hier ist ein String
4711print "Ich bin mir zu #{math.random! * 100}% sicher." 2400print "Ich bin mir zu #{math.random! * 100}% sicher."
4712``` 2401```
4713 2402
4714<YueDisplay>
4715
4716```yue
4717some_string = "Hier ist ein String
4718 mit einem Zeilenumbruch."
4719
4720-- Mit der #{}-Syntax kannst du Ausdrücke in String-Literale einbinden.
4721-- String-Interpolation gibt es nur in doppelt angeführten Strings.
4722print "Ich bin mir zu #{math.random! * 100}% sicher."
4723```
4724
4725</YueDisplay>
4726
4727## Zahlenliterale 2403## Zahlenliterale
4728 2404
4729Du kannst Unterstriche in Zahlenliteralen verwenden, um die Lesbarkeit zu erhöhen. 2405Du kannst Unterstriche in Zahlenliteralen verwenden, um die Lesbarkeit zu erhöhen.
@@ -4734,16 +2410,6 @@ hex = 0xEF_BB_BF
4734binary = 0B10011 2410binary = 0B10011
4735``` 2411```
4736 2412
4737<YueDisplay>
4738
4739```yue
4740integer = 1_000_000
4741hex = 0xEF_BB_BF
4742binary = 0B10011
4743```
4744
4745</YueDisplay>
4746
4747## YAML-Mehrzeilen-String 2413## YAML-Mehrzeilen-String
4748 2414
4749Das Präfix `|` führt ein mehrzeiliges String-Literal im YAML-Stil ein: 2415Das Präfix `|` führt ein mehrzeiliges String-Literal im YAML-Stil ein:
@@ -4756,18 +2422,6 @@ str = |
4756 - #{expr} 2422 - #{expr}
4757``` 2423```
4758 2424
4759<YueDisplay>
4760
4761```yue
4762str = |
4763 key: value
4764 list:
4765 - item1
4766 - #{expr}
4767```
4768
4769</YueDisplay>
4770
4771Damit lässt sich strukturierter, mehrzeiliger Text bequem schreiben. Alle Zeilenumbrüche und Einrückungen bleiben relativ zur ersten nicht-leeren Zeile erhalten, und Ausdrücke innerhalb von `#{...}` werden automatisch als `tostring(expr)` interpoliert. 2425Damit lässt sich strukturierter, mehrzeiliger Text bequem schreiben. Alle Zeilenumbrüche und Einrückungen bleiben relativ zur ersten nicht-leeren Zeile erhalten, und Ausdrücke innerhalb von `#{...}` werden automatisch als `tostring(expr)` interpoliert.
4772 2426
4773Der YAML-Mehrzeilen-String erkennt automatisch das gemeinsame führende Leerraumpräfix (minimale Einrückung über alle nicht-leeren Zeilen) und entfernt es aus allen Zeilen. So kannst du deinen Code optisch einrücken, ohne den resultierenden String zu verändern. 2427Der YAML-Mehrzeilen-String erkennt automatisch das gemeinsame führende Leerraumpräfix (minimale Einrückung über alle nicht-leeren Zeilen) und entfernt es aus allen Zeilen. So kannst du deinen Code optisch einrücken, ohne den resultierenden String zu verändern.
@@ -4780,18 +2434,6 @@ fn = ->
4780 return str 2434 return str
4781``` 2435```
4782 2436
4783<YueDisplay>
4784
4785```yue
4786fn = ->
4787 str = |
4788 foo:
4789 bar: baz
4790 return str
4791```
4792
4793</YueDisplay>
4794
4795Die interne Einrückung bleibt relativ zum entfernten gemeinsamen Präfix erhalten, wodurch saubere, verschachtelte Strukturen möglich sind. 2437Die interne Einrückung bleibt relativ zum entfernten gemeinsamen Präfix erhalten, wodurch saubere, verschachtelte Strukturen möglich sind.
4796 2438
4797Alle Sonderzeichen wie Anführungszeichen (`"`) und Backslashes (`\`) im YAML-Mehrzeilen-Block werden automatisch escaped, sodass der erzeugte Lua-String syntaktisch korrekt ist und wie erwartet funktioniert. 2439Alle Sonderzeichen wie Anführungszeichen (`"`) und Backslashes (`\`) im YAML-Mehrzeilen-Block werden automatisch escaped, sodass der erzeugte Lua-String syntaktisch korrekt ist und wie erwartet funktioniert.
@@ -4802,16 +2444,6 @@ str = |
4802 note: 'He said: "#{Hello}!"' 2444 note: 'He said: "#{Hello}!"'
4803``` 2445```
4804 2446
4805<YueDisplay>
4806
4807```yue
4808str = |
4809 path: "C:\Program Files\App"
4810 note: 'He said: "#{Hello}!"'
4811```
4812
4813</YueDisplay>
4814
4815# Module 2447# Module
4816 2448
4817## Import 2449## Import
@@ -4843,35 +2475,6 @@ do
4843 import "export" as {one, two, Something:{umm:{ch}}} 2475 import "export" as {one, two, Something:{umm:{ch}}}
4844``` 2476```
4845 2477
4846<YueDisplay>
4847
4848```yue
4849-- als Tabellen-Destrukturierung
4850do
4851 import insert, concat from table
4852 -- Fehler beim Zuweisen zu insert, concat
4853 import C, Ct, Cmt from require "lpeg"
4854 -- Kurzform für implizites Require
4855 import x, y, z from 'mymodule'
4856 -- Import im Python-Stil
4857 from 'module' import a, b, c
4858
4859-- Kurzform zum Laden eines Moduls
4860do
4861 import 'module'
4862 import 'module_x'
4863 import "d-a-s-h-e-s"
4864 import "module.part"
4865
4866-- Modul mit Alias oder Tabellen-Destrukturierung laden
4867do
4868 import "player" as PlayerModule
4869 import "lpeg" as :C, :Ct, :Cmt
4870 import "export" as {one, two, Something:{umm:{ch}}}
4871```
4872
4873</YueDisplay>
4874
4875## Import von Globals 2478## Import von Globals
4876 2479
4877Du kannst mit `import` bestimmte Globals in lokale Variablen importieren. Wenn du eine Kette von Globalzugriffen importierst, wird das letzte Feld der lokalen Variable zugewiesen. 2480Du kannst mit `import` bestimmte Globals in lokale Variablen importieren. Wenn du eine Kette von Globalzugriffen importierst, wird das letzte Feld der lokalen Variable zugewiesen.
@@ -4883,17 +2486,6 @@ do
4883 print concat ["a", tostring 1] 2486 print concat ["a", tostring 1]
4884``` 2487```
4885 2488
4886<YueDisplay>
4887
4888```yue
4889do
4890 import tostring
4891 import table.concat
4892 print concat ["a", tostring 1]
4893```
4894
4895</YueDisplay>
4896
4897### Automatischer Global-Import 2489### Automatischer Global-Import
4898 2490
4899Du kannst `import global` am Anfang eines Blocks platzieren, um automatisch alle Namen zu importieren, die im aktuellen Scope nicht explizit deklariert oder zugewiesen sind. Diese impliziten Importe werden als lokale `const` behandelt, die an die entsprechenden Globals zum Zeitpunkt der Anweisung gebunden sind. 2491Du kannst `import global` am Anfang eines Blocks platzieren, um automatisch alle Namen zu importieren, die im aktuellen Scope nicht explizit deklariert oder zugewiesen sind. Diese impliziten Importe werden als lokale `const` behandelt, die an die entsprechenden Globals zum Zeitpunkt der Anweisung gebunden sind.
@@ -4915,25 +2507,6 @@ do
4915 FLAG = 123 2507 FLAG = 123
4916``` 2508```
4917 2509
4918<YueDisplay>
4919
4920```yue
4921do
4922 import global
4923 print "hallo"
4924 math.random 3
4925 -- print = nil -- Fehler: importierte Globals sind const
4926
4927do
4928 -- explizite globale Variable wird nicht importiert
4929 import global
4930 global FLAG
4931 print FLAG
4932 FLAG = 123
4933```
4934
4935</YueDisplay>
4936
4937## Export 2510## Export
4938 2511
4939Die `export`-Anweisung bietet eine knappe Möglichkeit, Module zu definieren. 2512Die `export`-Anweisung bietet eine knappe Möglichkeit, Module zu definieren.
@@ -4958,26 +2531,6 @@ export class Something
4958 umm: "cool" 2531 umm: "cool"
4959``` 2532```
4960 2533
4961<YueDisplay>
4962
4963```yue
4964export a, b, c = 1, 2, 3
4965export cool = "Katze"
4966
4967export What = if this
4968 "abc"
4969else
4970 "def"
4971
4972export y = ->
4973 hallo = 3434
4974
4975export class Something
4976 umm: "cool"
4977```
4978
4979</YueDisplay>
4980
4981Benannter Export mit Destructuring. 2534Benannter Export mit Destructuring.
4982 2535
4983```yuescript 2536```yuescript
@@ -4985,15 +2538,6 @@ export :loadstring, to_lua: tolua = yue
4985export {itemA: {:fieldA = 'default'}} = tb 2538export {itemA: {:fieldA = 'default'}} = tb
4986``` 2539```
4987 2540
4988<YueDisplay>
4989
4990```yue
4991export :loadstring, to_lua: tolua = yue
4992export {itemA: {:fieldA = 'default'}} = tb
4993```
4994
4995</YueDisplay>
4996
4997Benannte Elemente aus dem Modul exportieren, ohne lokale Variablen zu erstellen. 2541Benannte Elemente aus dem Modul exportieren, ohne lokale Variablen zu erstellen.
4998 2542
4999```yuescript 2543```yuescript
@@ -5002,16 +2546,6 @@ export.<index> = items
5002export["a-b-c"] = 123 2546export["a-b-c"] = 123
5003``` 2547```
5004 2548
5005<YueDisplay>
5006
5007```yue
5008export.itemA = tb
5009export.<index> = items
5010export["a-b-c"] = 123
5011```
5012
5013</YueDisplay>
5014
5015### Unbenannter Export 2549### Unbenannter Export
5016 2550
5017Unbenannter Export fügt das Ziel-Element in den Array-Teil der exportierten Tabelle ein. 2551Unbenannter Export fügt das Ziel-Element in den Array-Teil der exportierten Tabelle ein.
@@ -5029,23 +2563,6 @@ export with tmp
5029 j = 2000 2563 j = 2000
5030``` 2564```
5031 2565
5032<YueDisplay>
5033
5034```yue
5035d, e, f = 3, 2, 1
5036export d, e, f
5037
5038export if this
5039 123
5040else
5041 456
5042
5043export with tmp
5044 j = 2000
5045```
5046
5047</YueDisplay>
5048
5049### Default-Export 2566### Default-Export
5050 2567
5051Mit dem Schlüsselwort **default** in einer `export`-Anweisung wird die exportierte Tabelle durch ein beliebiges Objekt ersetzt. 2568Mit dem Schlüsselwort **default** in einer `export`-Anweisung wird die exportierte Tabelle durch ein beliebiges Objekt ersetzt.
@@ -5056,16 +2573,6 @@ export default ->
5056 123 2573 123
5057``` 2574```
5058 2575
5059<YueDisplay>
5060
5061```yue
5062export default ->
5063 print "hallo"
5064 123
5065```
5066
5067</YueDisplay>
5068
5069# Lizenz: MIT 2576# Lizenz: MIT
5070 2577
5071Hinweis: Die MIT-Lizenz ist unten im englischen Originaltext wiedergegeben. 2578Hinweis: Die MIT-Lizenz ist unten im englischen Originaltext wiedergegeben.