diff options
| author | Li Jin <dragon-fly@qq.com> | 2026-04-24 10:19:45 +0800 |
|---|---|---|
| committer | Li Jin <dragon-fly@qq.com> | 2026-04-24 10:19:45 +0800 |
| commit | 20db78597b92cec00dd6f650278c3cdcf6e3e4bf (patch) | |
| tree | 9cf1dd59a638d6f4fe3eb04ee6e83d80e5b28b0e /doc/docs/de | |
| parent | acb80dec2706359027c0461073aded3420eaec56 (diff) | |
| download | yuescript-20db78597b92cec00dd6f650278c3cdcf6e3e4bf.tar.gz yuescript-20db78597b92cec00dd6f650278c3cdcf6e3e4bf.tar.bz2 yuescript-20db78597b92cec00dd6f650278c3cdcf6e3e4bf.zip | |
Updated docs.
Diffstat (limited to 'doc/docs/de')
| -rw-r--r-- | doc/docs/de/doc/advanced/macro.md | 142 |
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 | ||
| 340 | Weitere Details zu verfügbaren AST-Knoten findest du in den großgeschriebenen Definitionen in `yue_parser.cpp`. | 340 | Weitere Details zu verfügbaren AST-Knoten findest du in den großgeschriebenen Definitionen in `yue_parser.cpp`. |
| 341 | |||
| 342 | ## Annotation-Anweisungen | ||
| 343 | |||
| 344 | Annotation-Anweisungen wenden ein Makro auf die direkt folgende Anweisung an. | ||
| 345 | |||
| 346 | Das entspricht einem Makroaufruf, bei dem der Quelltext der folgenden Anweisung als letztes Argument zusätzlich übergeben wird. | ||
| 347 | |||
| 348 | ```yuescript | ||
| 349 | macro ShowName = (code) -> | | ||
| 350 | print "#{code\match '^[%w_]*'}" | ||
| 351 | |||
| 352 | $[ShowName] | ||
| 353 | myFunc = -> | ||
| 354 | |||
| 355 | return | ||
| 356 | ``` | ||
| 357 | |||
| 358 | <YueDisplay> | ||
| 359 | |||
| 360 | ```yue | ||
| 361 | macro ShowName = (code) -> | | ||
| 362 | print "#{code\match '^[%w_]*'}" | ||
| 363 | |||
| 364 | $[ShowName] | ||
| 365 | myFunc = -> | ||
| 366 | |||
| 367 | return | ||
| 368 | ``` | ||
| 369 | |||
| 370 | </YueDisplay> | ||
| 371 | |||
| 372 | Wenn 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 | ||
| 375 | macro 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] | ||
| 383 | tableA = {} | ||
| 384 | |||
| 385 | $[Tag after] | ||
| 386 | tableB = {} | ||
| 387 | |||
| 388 | return | ||
| 389 | ``` | ||
| 390 | |||
| 391 | <YueDisplay> | ||
| 392 | |||
| 393 | ```yue | ||
| 394 | macro 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] | ||
| 402 | tableA = {} | ||
| 403 | |||
| 404 | $[Tag after] | ||
| 405 | tableB = {} | ||
| 406 | |||
| 407 | return | ||
| 408 | ``` | ||
| 409 | |||
| 410 | </YueDisplay> | ||
| 411 | |||
| 412 | Da 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 | ||
| 415 | macro Register = (registry, code`ClassDecl) -> | ||
| 416 | className = code\match "^class%s+(%w+)" | ||
| 417 | return | | ||
| 418 | #{registry}["#{className}"] = #{className} | ||
| 419 | |||
| 420 | registry = {} | ||
| 421 | |||
| 422 | $[Register(registry)] | ||
| 423 | class Worker | ||
| 424 | run: => "ok" | ||
| 425 | |||
| 426 | return | ||
| 427 | ``` | ||
| 428 | |||
| 429 | <YueDisplay> | ||
| 430 | |||
| 431 | ```yue | ||
| 432 | macro Register = (registry, code`ClassDecl) -> | ||
| 433 | className = code\match "^class%s+(%w+)" | ||
| 434 | return | | ||
| 435 | #{registry}["#{className}"] = #{className} | ||
| 436 | |||
| 437 | registry = {} | ||
| 438 | |||
| 439 | $[Register(registry)] | ||
| 440 | class Worker | ||
| 441 | run: => "ok" | ||
| 442 | |||
| 443 | return | ||
| 444 | ``` | ||
| 445 | |||
| 446 | </YueDisplay> | ||
| 447 | |||
| 448 | Annotationen können auch Wrapper-Code um Funktionen herum einfügen: | ||
| 449 | |||
| 450 | ```yuescript | ||
| 451 | macro 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] | ||
| 461 | add = (a, b) -> a + b | ||
| 462 | ``` | ||
| 463 | |||
| 464 | <YueDisplay> | ||
| 465 | |||
| 466 | ```yue | ||
| 467 | macro 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] | ||
| 477 | add = (a, b) -> a + b | ||
| 478 | ``` | ||
| 479 | |||
| 480 | </YueDisplay> | ||
| 481 | |||
| 482 | Auf 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. | ||
