Primeiro, quero esclarecer que a mensagem "Quando sua linguagem escrever macros usando AST a gente conversa" foi só uma piada. Lendo de novo está me soando meio passivo-agressivo kkkkk
Então, existem dois tipos de "macros"
Templates
referencia
aqui é bem estilo do define do C, parafraseando os docs
Templates are a simple substitution mechanism that operates on Nim's abstract syntax trees
They integrate well with the rest of the language and share none of C's preprocessor macros flaws
template `!=` (a, b: untyped): untyped =
# this definition exists in the System module
not (a == b)
assert(5 != 6) # the compiler rewrites that to: assert(not (5 == 6))
Obs: sobre o `!=`, Nim pode criar operadores assim, mas se removesse os ` e colocasse um nome valido, teria mais cara de função
macros
Esse é o que usa AST. ela é estilo uma função que recebe a AST de um bloco, e retorna uma nova, nem eu entendo mais a fundo como ela funciona, mas é basicamente isso. Recomendo que veja exemplos aqui
E isso permite umas coisas muito legais na linguagem, por exemplo
- nimsl | uma biblioteca que permite transformar diretamente código Nim em GLSL (linguagem que roda na GPU)
- wxnim | biblioteca de GUI que uma uma macro para ter uma criação de interfaces mais declarativas
#exemplo wxnim, que é código valido em nim
Panel | Boxsizer(orient = wxHorizontal):
StaticBox(label = "Basic controls") | StaticBoxSizer(orient = wxVertical):
Button: "Click me!"
CheckBox: "Check me!"
Para finalizar, leve tudo isso com um grão de açucar, eu não fiz muito mais que um hello world até então 😅