DSL de Logging
Nesta página
Uma família de macros pequenos pode formar uma mini-DSL — um vocabulário
específico de domínio sem a necessidade de um framework externo. Cada nível
(INFO, WARN, ERROR) vira um macro dedicado que prefixa a mensagem
automaticamente. O argumento é qualquer expressão de string, incluindo
interpolações.
O macro log_at! acrescenta um campo de horário, mostrando como compor
macros com aridade variada para enriquecer o contexto:
log_info!, log_warn!, log_error! e log_at! formando uma DSL de log concisa.
08-logging-dsl.zolo
// Feature: Mini logging DSL with macros
// Syntax: several small macros that prefix messages with a level
// When to use: standardize log format without needing a framework;
// makes the level visually obvious in code.
macro log_info(msg) {
print("[INFO ] {$msg}")
}
macro log_warn(msg) {
print("[WARN ] {$msg}")
}
macro log_error(msg) {
print("[ERROR] {$msg}")
}
// Direct usage.
log_info!("server started")
log_warn!("slow connection")
log_error!("database timeout")
// expected:
// [INFO ] server started
// [WARN ] slow connection
// [ERROR] database timeout
// Combined with interpolation — the argument is any expr.
let user = "alice"
let attempts = 3
log_warn!("user {user} tried {attempts} times")
// expected: [WARN ] user alice tried 3 times
// Composed macro: log with simulated timestamp.
macro log_at(when, level, msg) {
print("[{$when}][{$level}] {$msg}")
}
log_at!("12:00:01", "INFO", "boot complete")
// expected: [12:00:01][INFO] boot complete
Desafio
Adicione um macro log_debug!(msg) que imprime "[DEBUG] msg", mas apenas
quando uma variável let debug_mode = true estiver definida no escopo. Use
pick! do capítulo de múltiplos parâmetros para condicionar a impressão.