2026-08-31 22:26 UTC
Dites les rust-gens, est-ce qu’il y a un moyen dans une macro simple (macro_rules quoi) de parser un literal ?
En fait, je voudrais faire une macro bits!(0b00101) qui me retourne un tuple avec la valeur dans le paramètre et sa longueur en bits. Dans cet exemple elle me retournerait un tuple (0b00101, 5).
Est-ce que c’est possible ? 🤓
Pour l’instant j’ai fait ça, et ça « marche » si je sépare les digits, mais bon c’est pas du tout pratique bien sûr, et pas vraiment ce que je veux :
macro_rules! bits {
($($tree:tt)+) => {
(
parse_bits!(0, $($tree)+),
count!($($tree)+),
)
};
}
macro_rules! parse_bits {
($n:expr, ) => { $n };
($n:expr, 0 $($rest:tt)*) => { parse_bits!(($n { parse_bits!(($n { 0 };
// Even case: count half the objects and double the result
($($a:tt $b:tt)+) => { count!($($a)+) { 1 + (count!($($a)*) << 1) };
}
#[cfg(test)]
mod tests {
use super::*;
#[test]
fn test_bits_macro() {
assert_eq!(bits!(0 1 1 0 0), (0b01100, 5));
}
}
#rust
Replies (1)
-
@loskraes@tooting.ch 2026-09-01 05:28
@jor@eldritch.cafe On ne peux pas parse directement en dessous du token avec macro_rules. Par contre on peux convertir en str puis appeller des fonctions dessus, pour avoir juste la longueur en valeur de retour ça fonction, mais on ne peux pas créer des fonction/code different en fonction de ça