Génération de code

Les macros peuvent être utilisées pour générer du code. On veut ici définir une arithmétique un peu spéciale appelée "zéro arithmétique" : si le résultat d'une opération ne peut pas être représenté sur le type voulu, cela ne provoque pas une erreur mais renvoie la valeur 0.

On définit un trait Zero_Arith qui rajoute des opérations sur les types qui implémentent ce trait :

trait ZeroArith {
    fn zero_add(self, other: Self) -> Self;
    fn zero_sub(self, other: Self) -> Self;
    fn zero_mul(self, other: Self) -> Self;
    fn zero_div(self, other: Self) -> Self;
}

On souhaite implémenter ce type pour tous les types entiers (isize, i8, i16, i32, i64, i128, usize, u8, u16, u32, u64 et u128) tout en minimisant les répétitions de code.

  1. Après avoir défini ce trait, implémentez une macro impl_zero_arith! qui prend un type en paramètre et implémente les fonctions demandées.

On s'attend ici à ce que vous utilisiez une deuxième macro appelé par la première pour pouvoir implémenter, sur chaque type, les différentes fonctions en minimisant les répétitions.

  1. Testez votre code. Notamment 200u8.zero_add(200u8) doit retourner 0u8, alors que 100u8.zero_add(50u8) retournera 150u8.