From 20db78597b92cec00dd6f650278c3cdcf6e3e4bf Mon Sep 17 00:00:00 2001 From: Li Jin Date: Fri, 24 Apr 2026 10:19:45 +0800 Subject: Updated docs. --- doc/docs/de/doc/advanced/macro.md | 142 ++++++++++++++++++++++++++++++++++++++ 1 file changed, 142 insertions(+) (limited to 'doc/docs/de') 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" Weitere Details zu verfügbaren AST-Knoten findest du in den großgeschriebenen Definitionen in `yue_parser.cpp`. + +## Annotation-Anweisungen + +Annotation-Anweisungen wenden ein Makro auf die direkt folgende Anweisung an. + +Das entspricht einem Makroaufruf, bei dem der Quelltext der folgenden Anweisung als letztes Argument zusätzlich übergeben wird. + +```yuescript +macro ShowName = (code) -> | + print "#{code\match '^[%w_]*'}" + +$[ShowName] +myFunc = -> + +return +``` + + + +```yue +macro ShowName = (code) -> | + print "#{code\match '^[%w_]*'}" + +$[ShowName] +myFunc = -> + +return +``` + + + +Wenn das Annotationsmakro eine Konfigurationstabelle zurückgibt, steuert das optionale Feld `before`, ob das Ergebnis vor oder nach der annotierten Anweisung eingefügt wird. + +```yuescript +macro Tag = (tag, code) -> + tableName = code\match "^[%w_]+" + return + type: "text" + before: tag == "before" + code: "-- #{tag}:#{tableName}" + +$[Tag before] +tableA = {} + +$[Tag after] +tableB = {} + +return +``` + + + +```yue +macro Tag = (tag, code) -> + tableName = code\match "^[%w_]+" + return + type: "text" + before: tag == "before" + code: "-- #{tag}:#{tableName}" + +$[Tag before] +tableA = {} + +$[Tag after] +tableB = {} + +return +``` + + + +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. + +```yuescript +macro Register = (registry, code`ClassDecl) -> + className = code\match "^class%s+(%w+)" + return | + #{registry}["#{className}"] = #{className} + +registry = {} + +$[Register(registry)] +class Worker + run: => "ok" + +return +``` + + + +```yue +macro Register = (registry, code`ClassDecl) -> + className = code\match "^class%s+(%w+)" + return | + #{registry}["#{className}"] = #{className} + +registry = {} + +$[Register(registry)] +class Worker + run: => "ok" + +return +``` + + + +Annotationen können auch Wrapper-Code um Funktionen herum einfügen: + +```yuescript +macro ValidateNumberArgs = (code) -> + funcName = code\match "^(%w+)%s*=" + return | + local __orig_#{funcName} = #{funcName} + #{funcName} = (...) -> + for i = 1, select "#", ... + assert type(select i, ...) == "number", "expected number for arg \#{i}" + __orig_#{funcName} ... + +$[ValidateNumberArgs] +add = (a, b) -> a + b +``` + + + +```yue +macro ValidateNumberArgs = (code) -> + funcName = code\match "^(%w+)%s*=" + return | + local __orig_#{funcName} = #{funcName} + #{funcName} = (...) -> + for i = 1, select "#", ... + assert type(select i, ...) == "number", "expected number for arg \#{i}" + __orig_#{funcName} ... + +$[ValidateNumberArgs] +add = (a, b) -> a + b +``` + + + +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. -- cgit v1.2.3-55-g6feb