Pular para o conteúdo

stringify! e assert!

Nesta página

stringify! é um macro embutido que converte a forma sintática de uma expressão em string — não o valor, mas o código que você escreveu. Isso é especialmente útil para mensagens de depuração e erro que mostram o que estava no código, não apenas o resultado numérico.

O padrão dbg! abaixo combina stringify! com o valor avaliado para produzir saídas como [dbg] count * 2 = 14:

stringify! embutido e macro dbg! que mostra código-fonte junto ao valor.

03-stringify.zolo
Playground
// Feature: `stringify!` — converts an expression into a source string

// Syntax: `stringify!(expr)` — built-in macro

// When to use: assert/debug messages that show the original code, not

// just the value. Pairs beautifully with custom macros.


// `stringify!` captures the syntactic form of the expression.

let s = stringify!(1 + 2 * 3)
print(s)

// expected: 1 + 2 * 3


// Works with identifiers, calls, any expression.

let n = stringify!(hello_world)
print(n)

// expected: hello_world


let call = stringify!(foo(1, 2))
print(call)

// expected: foo(1, 2)


// Useful pattern: dbg! shows "expr = value".

macro dbg(x) {
  print("[dbg] {stringify!($x)} = {$x}")
}


let count = 7
dbg!(count)
dbg!(count * 2)
dbg!(count > 5)
// expected:

// [dbg] count = 7

// [dbg] count * 2 = 14

// [dbg] count > 5 = true

Com stringify! disponível, é direto construir macros de asserção que exibem a expressão que falhou. assert! aborta com a forma textual da condição; assert_eq! mostra lados esquerdo e direito separadamente:

assert! e assert_eq! com mensagens de falha automáticas via stringify!.

07-assert.zolo
Playground
// Feature: Practical macros — `assert!` and `expect!`

// Syntax: combines `stringify!` with the expression for rich messages

// When to use: inline tests and validations with syntactic context.


// assert!: aborts if the condition is false, showing the original code.

macro assert(cond) {
  if !$cond {
    panic("assertion failed: {stringify!($cond)}")
  }
}


assert!(1 + 1 == 2)
assert!("zolo".len() == 4)
print("all asserts passed")

// expected: all asserts passed


// assert_eq!: equality with a useful message on failure.

macro assert_eq(actual, expected) {
  if $actual != $expected {
    panic("assert_eq failed: {stringify!($actual)} != {$expected}, got {$actual}")
  }
}


let result = 2 * 21
assert_eq!(result, 42)
print("ok")
// expected: ok

Desafio

Escreva um macro assert_gt!(a, b) que falha com a mensagem "esperado {stringify!($a)} > {stringify!($b)}, mas {$a} <= {$b}" quando a <= b. Teste com assert_gt!(5, 3) (passa) e assert_gt!(2, 10) (deve abortar).

Buscar no Zolo

9 resultados

enespt-br