aboutsummaryrefslogtreecommitdiff
path: root/doc/docs/de
diff options
context:
space:
mode:
Diffstat (limited to 'doc/docs/de')
-rw-r--r--doc/docs/de/doc/advanced/macro.md142
1 files changed, 142 insertions, 0 deletions
diff --git a/doc/docs/de/doc/advanced/macro.md b/doc/docs/de/doc/advanced/macro.md
index 8b78306..4287b2f 100644
--- a/doc/docs/de/doc/advanced/macro.md
+++ b/doc/docs/de/doc/advanced/macro.md
@@ -338,3 +338,145 @@ $printNumAndStr 123, "hallo"
338</YueDisplay> 338</YueDisplay>
339 339
340Weitere Details zu verfügbaren AST-Knoten findest du in den großgeschriebenen Definitionen in `yue_parser.cpp`. 340Weitere Details zu verfügbaren AST-Knoten findest du in den großgeschriebenen Definitionen in `yue_parser.cpp`.
341
342## Annotation-Anweisungen
343
344Annotation-Anweisungen wenden ein Makro auf die direkt folgende Anweisung an.
345
346Das entspricht einem Makroaufruf, bei dem der Quelltext der folgenden Anweisung als letztes Argument zusätzlich übergeben wird.
347
348```yuescript
349macro ShowName = (code) -> |
350 print "#{code\match '^[%w_]*'}"
351
352$[ShowName]
353myFunc = ->
354
355return
356```
357
358<YueDisplay>
359
360```yue
361macro ShowName = (code) -> |
362 print "#{code\match '^[%w_]*'}"
363
364$[ShowName]
365myFunc = ->
366
367return
368```
369
370</YueDisplay>
371
372Wenn das Annotationsmakro eine Konfigurationstabelle zurückgibt, steuert das optionale Feld `before`, ob das Ergebnis vor oder nach der annotierten Anweisung eingefügt wird.
373
374```yuescript
375macro Tag = (tag, code) ->
376 tableName = code\match "^[%w_]+"
377 return
378 type: "text"
379 before: tag == "before"
380 code: "-- #{tag}:#{tableName}"
381
382$[Tag before]
383tableA = {}
384
385$[Tag after]
386tableB = {}
387
388return
389```
390
391<YueDisplay>
392
393```yue
394macro Tag = (tag, code) ->
395 tableName = code\match "^[%w_]+"
396 return
397 type: "text"
398 before: tag == "before"
399 code: "-- #{tag}:#{tableName}"
400
401$[Tag before]
402tableA = {}
403
404$[Tag after]
405tableB = {}
406
407return
408```
409
410</YueDisplay>
411
412Da die folgende Anweisung als zusätzliches Makroargument übergeben wird, lassen sich mit Annotationen auch direkt Registrierungszeilen aus Klassendeklarationen erzeugen. Du kannst dabei dieselben AST-Argumentprüfungen wie bei normalen Makros verwenden.
413
414```yuescript
415macro Register = (registry, code`ClassDecl) ->
416 className = code\match "^class%s+(%w+)"
417 return |
418 #{registry}["#{className}"] = #{className}
419
420registry = {}
421
422$[Register(registry)]
423class Worker
424 run: => "ok"
425
426return
427```
428
429<YueDisplay>
430
431```yue
432macro Register = (registry, code`ClassDecl) ->
433 className = code\match "^class%s+(%w+)"
434 return |
435 #{registry}["#{className}"] = #{className}
436
437registry = {}
438
439$[Register(registry)]
440class Worker
441 run: => "ok"
442
443return
444```
445
446</YueDisplay>
447
448Annotationen können auch Wrapper-Code um Funktionen herum einfügen:
449
450```yuescript
451macro ValidateNumberArgs = (code) ->
452 funcName = code\match "^(%w+)%s*="
453 return |
454 local __orig_#{funcName} = #{funcName}
455 #{funcName} = (...) ->
456 for i = 1, select "#", ...
457 assert type(select i, ...) == "number", "expected number for arg \#{i}"
458 __orig_#{funcName} ...
459
460$[ValidateNumberArgs]
461add = (a, b) -> a + b
462```
463
464<YueDisplay>
465
466```yue
467macro ValidateNumberArgs = (code) ->
468 funcName = code\match "^(%w+)%s*="
469 return |
470 local __orig_#{funcName} = #{funcName}
471 #{funcName} = (...) ->
472 for i = 1, select "#", ...
473 assert type(select i, ...) == "number", "expected number for arg \#{i}"
474 __orig_#{funcName} ...
475
476$[ValidateNumberArgs]
477add = (a, b) -> a + b
478```
479
480</YueDisplay>
481
482Auf eine Annotation muss immer eine Anweisung folgen, und sie kann nicht auf eine `return`-Anweisung angewendet werden. Wenn die annotierte Anweisung am Ende eines Blocks steht und du die rohe AST-Form der Anweisung brauchst, füge ein explizites `return` danach ein, damit sie nicht in einen implizit zurückgegebenen Ausdruck eingebettet wird.