aboutsummaryrefslogtreecommitdiff
path: root/doc/docs/pt-br
diff options
context:
space:
mode:
authorLi Jin <dragon-fly@qq.com>2026-04-24 10:19:45 +0800
committerLi Jin <dragon-fly@qq.com>2026-04-24 10:19:45 +0800
commit20db78597b92cec00dd6f650278c3cdcf6e3e4bf (patch)
tree9cf1dd59a638d6f4fe3eb04ee6e83d80e5b28b0e /doc/docs/pt-br
parentacb80dec2706359027c0461073aded3420eaec56 (diff)
downloadyuescript-20db78597b92cec00dd6f650278c3cdcf6e3e4bf.tar.gz
yuescript-20db78597b92cec00dd6f650278c3cdcf6e3e4bf.tar.bz2
yuescript-20db78597b92cec00dd6f650278c3cdcf6e3e4bf.zip
Updated docs.
Diffstat (limited to 'doc/docs/pt-br')
-rw-r--r--doc/docs/pt-br/doc/advanced/macro.md142
1 files changed, 142 insertions, 0 deletions
diff --git a/doc/docs/pt-br/doc/advanced/macro.md b/doc/docs/pt-br/doc/advanced/macro.md
index 248011e..6fa04be 100644
--- a/doc/docs/pt-br/doc/advanced/macro.md
+++ b/doc/docs/pt-br/doc/advanced/macro.md
@@ -337,3 +337,145 @@ $printNumAndStr 123, "hello"
337</YueDisplay> 337</YueDisplay>
338 338
339Para mais detalhes sobre os nós AST disponíveis, consulte as definições em maiúsculas em [yue_parser.cpp](https://github.com/IppClub/YueScript/blob/main/src/yuescript/yue_parser.cpp). 339Para mais detalhes sobre os nós AST disponíveis, consulte as definições em maiúsculas em [yue_parser.cpp](https://github.com/IppClub/YueScript/blob/main/src/yuescript/yue_parser.cpp).
340
341## Instruções de anotação
342
343As instruções de anotação aplicam uma macro à instrução logo em seguida.
344
345Isso equivale a chamar a macro com o código-fonte da instrução seguinte anexado como último argumento.
346
347```yuescript
348macro ShowName = (code) -> |
349 print "#{code\match '^[%w_]*'}"
350
351$[ShowName]
352myFunc = ->
353
354return
355```
356
357<YueDisplay>
358
359```yue
360macro ShowName = (code) -> |
361 print "#{code\match '^[%w_]*'}"
362
363$[ShowName]
364myFunc = ->
365
366return
367```
368
369</YueDisplay>
370
371Quando a macro de anotação retorna uma tabela de configuração, o campo opcional `before` controla se o resultado gerado será emitido antes ou depois da instrução anotada.
372
373```yuescript
374macro Tag = (tag, code) ->
375 tableName = code\match "^[%w_]+"
376 return
377 type: "text"
378 before: tag == "before"
379 code: "-- #{tag}:#{tableName}"
380
381$[Tag before]
382tableA = {}
383
384$[Tag after]
385tableB = {}
386
387return
388```
389
390<YueDisplay>
391
392```yue
393macro Tag = (tag, code) ->
394 tableName = code\match "^[%w_]+"
395 return
396 type: "text"
397 before: tag == "before"
398 code: "-- #{tag}:#{tableName}"
399
400$[Tag before]
401tableA = {}
402
403$[Tag after]
404tableB = {}
405
406return
407```
408
409</YueDisplay>
410
411Como a instrução seguinte é passada como um argumento extra para a macro, anotações também podem ser usadas para gerar código de registro a partir de declarações de classe. Você também pode usar as mesmas checagens de AST nos argumentos que macros normais oferecem.
412
413```yuescript
414macro Register = (registry, code`ClassDecl) ->
415 className = code\match "^class%s+(%w+)"
416 return |
417 #{registry}["#{className}"] = #{className}
418
419registry = {}
420
421$[Register(registry)]
422class Worker
423 run: => "ok"
424
425return
426```
427
428<YueDisplay>
429
430```yue
431macro Register = (registry, code`ClassDecl) ->
432 className = code\match "^class%s+(%w+)"
433 return |
434 #{registry}["#{className}"] = #{className}
435
436registry = {}
437
438$[Register(registry)]
439class Worker
440 run: => "ok"
441
442return
443```
444
445</YueDisplay>
446
447Anotações também podem injetar código de empacotamento em volta de funções:
448
449```yuescript
450macro ValidateNumberArgs = (code) ->
451 funcName = code\match "^(%w+)%s*="
452 return |
453 local __orig_#{funcName} = #{funcName}
454 #{funcName} = (...) ->
455 for i = 1, select "#", ...
456 assert type(select i, ...) == "number", "expected number for arg \#{i}"
457 __orig_#{funcName} ...
458
459$[ValidateNumberArgs]
460add = (a, b) -> a + b
461```
462
463<YueDisplay>
464
465```yue
466macro ValidateNumberArgs = (code) ->
467 funcName = code\match "^(%w+)%s*="
468 return |
469 local __orig_#{funcName} = #{funcName}
470 #{funcName} = (...) ->
471 for i = 1, select "#", ...
472 assert type(select i, ...) == "number", "expected number for arg \#{i}"
473 __orig_#{funcName} ...
474
475$[ValidateNumberArgs]
476add = (a, b) -> a + b
477```
478
479</YueDisplay>
480
481Uma anotação sempre precisa ser seguida por uma instrução, e ela não pode ser aplicada a uma instrução `return`. Se a instrução anotada aparecer no fim de um bloco e você precisar da forma AST bruta dessa instrução, adicione um `return` explícito em seguida para evitar que ela seja envolvida por uma expressão com retorno implícito.