Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- mod exp {
- pub trait Exp {
- fn lit(_: Self) -> Self;
- fn neg(_: Self) -> Self;
- fn add(_: Self, _: Self) -> Self;
- }
- pub fn lit<T: Exp>(x: T) -> T {
- T::lit(x)
- }
- pub fn neg<T: Exp>(x: T) -> T {
- T::neg(x)
- }
- pub fn add<T: Exp>(x: T, y: T) -> T {
- T::add(x, y)
- }
- // view et eval choisissent l'impl en imposant le type du paramètre
- pub fn view<T: Exp>(x: T) -> T {
- x
- }
- pub fn eval<T: Exp>(x: T) -> T {
- x
- }
- impl Exp for i32 {
- fn lit(x: Self) -> Self {
- x
- }
- fn neg(x: Self) -> Self {
- -x
- }
- fn add(e1: Self, e2: Self) -> Self {
- e1 + e2
- }
- }
- impl Exp for String {
- fn lit(x: Self) -> Self {
- format!("{}", x)
- }
- fn neg(x: Self) -> Self {
- format!("- {}", x)
- }
- fn add(e1: Self, e2: Self) -> Self {
- format!("{} + {}", e1, e2)
- }
- }
- }
- use exp::*;
- fn main() {
- let x = add(lit(5), neg(lit(3)));
- println!("{}", view(x));
- println!("{}", eval(x));
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement