Introducción
En este laboratorio, exploramos el concepto de Lenguajes Específicos de Dominio (DSL, por sus siglas en inglés) en Rust, que son mini "lenguajes" incrustados en macros de Rust. Estas macros se expanden en constructos normales de Rust, pero ofrecen una sintaxis concisa e intuitiva para una funcionalidad específica. Se demuestra un ejemplo práctico utilizando una API de calculadora, donde se suministra una expresión a la macro y la salida se imprime en la consola. Esto permite la creación de interfaces más complejas como las que se encuentran en bibliotecas como lazy_static o clap.
Nota: Si el laboratorio no especifica un nombre de archivo, puede utilizar cualquier nombre de archivo que desee. Por ejemplo, puede utilizar
main.rs, compilar y ejecutarlo conrustc main.rs &&./main.
Lenguajes Específicos de Dominio (DSLs)
Un DSL es un mini "lenguaje" incrustado en una macro de Rust. Es completamente código válido de Rust porque el sistema de macros se expande en constructos normales de Rust, pero parece un pequeño lenguaje. Esto te permite definir una sintaxis concisa o intuitiva para alguna funcionalidad especial (dentro de límites).
Supongamos que quiero definir una pequeña API de calculadora. Me gustaría suministrar una expresión y que se imprima la salida en la consola.
macro_rules! calculate {
(eval $e:expr) => {
{
let val: usize = $e; // Forzar que los tipos sean enteros
println!("{} = {}", stringify!{$e}, val);
}
};
}
fn main() {
calculate! {
eval 1 + 2 // jaja `eval` no es una palabra clave de Rust!
}
calculate! {
eval (1 + 2) * (3 / 4)
}
}
Salida:
1 + 2 = 3
(1 + 2) * (3 / 4) = 0
Este fue un ejemplo muy simple.
También, nota los dos pares de llaves en la macro. Las externas son parte de la sintaxis de macro_rules!, además de () o [].
Resumen
¡Felicitaciones! Has completado el laboratorio de Lenguajes Específicos de Dominio (DSLs). Puedes practicar más laboratorios en LabEx para mejorar tus habilidades.