Saltar al contenido

Definición e Invocación

En esta página

Un macro se declara con la palabra clave macro, seguida del nombre, los parámetros entre paréntesis y el cuerpo entre llaves. Dentro del cuerpo, cada parámetro se referencia con el prefijo $. La invocación usa name!(arg) — el ! final es la convención visual que distingue los macros de las llamadas a función.

El argumento puede ser cualquier expresión: un literal, aritmética, una llamada a función. La sustitución es textual, por lo que double!(5 + 5) se expande a (5 + 5) + (5 + 5):

Macro de un parámetro: double! demuestra la sustitución textual con literales, aritmética y una llamada a función.

01-basics.zolo
Playground
// Feature: Macros — basic definition

// Syntax: `macro name(p1, p2) { ... }` + invocation `name!(arg)`

// When to use: generate repetitive code at expansion time (before

// typecheck and lowering). Useful to wrap textual patterns that a

// function cannot capture — `stringify!`, `assert!`, `dbg!`, etc.


// Simplest macro: doubles the received expression.

// Note: parameters are referenced with `$name` in the body.

macro double(x) {
  $x + $x
}


// Invocation uses `!` at the end — convention that distinguishes from a regular function.

let result = double!(21)
print(result)

// expected: 42


// The argument can be any expression — it is pasted textually.

print(double!(5 + 5))

// expected: 20


// Macros are purely syntactic: you can pass identifiers, function

// calls, literals, arithmetic expressions...

fn ten() -> int {
  return 10
}

print(double!(ten()))
// expected: 20

Cuando se necesita combinar más de un valor, declara varios parámetros. show_pair! ilustra la interpolación de cadenas con dos parámetros; pick! usa tres para implementar un condicional en línea:

sum3!, show_pair! y pick! muestran múltiples parámetros y expansión condicional.

02-multiple-params.zolo
Playground
// Feature: Macros with multiple parameters

// Syntax: `macro name(a, b, c) { ... }` — any fixed number of params

// When to use: combine or compare multiple expressions at one expansion

// site.


// Sum of three expressions.

macro sum3(a, b, c) {
  $a + $b + $c
}


print(sum3!(1, 2, 3))

// expected: 6


// Print two arguments with a label.

macro show_pair(label, value) {
  print("{$label} = {$value}")
}


show_pair!("count", 42)
show_pair!("name", "zolo")

// expected:

// count = 42

// name = zolo


// Ternary comparison via macro.

macro pick(cond, a, b) {
  if $cond { $a } else { $b }
}


let x = 7
let max = pick!(x > 5, x, 5)
print(max)
// expected: 7

Desafío

Crea un macro clamp!(val, lo, hi) que devuelva lo si val < lo, hi si val > hi, o val en caso contrario. Pruébalo con clamp!(15, 0, 10) y clamp!(-5, 0, 10).

Consulta también

Buscar en Zolo

9 resultados

enespt-br