Advertisement
Guest User

Untitled

a guest
Oct 14th, 2019
116
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 1.11 KB | None | 0 0
  1. mod exp {
  2. pub trait Exp {
  3. fn lit(_: Self) -> Self;
  4. fn neg(_: Self) -> Self;
  5. fn add(_: Self, _: Self) -> Self;
  6. }
  7.  
  8. pub fn lit<T: Exp>(x: T) -> T {
  9. T::lit(x)
  10. }
  11.  
  12. pub fn neg<T: Exp>(x: T) -> T {
  13. T::neg(x)
  14. }
  15.  
  16. pub fn add<T: Exp>(x: T, y: T) -> T {
  17. T::add(x, y)
  18. }
  19.  
  20. // view et eval choisissent l'impl en imposant le type du paramètre
  21. pub fn view<T: Exp>(x: T) -> T {
  22. x
  23. }
  24. pub fn eval<T: Exp>(x: T) -> T {
  25. x
  26. }
  27.  
  28. impl Exp for i32 {
  29. fn lit(x: Self) -> Self {
  30. x
  31. }
  32. fn neg(x: Self) -> Self {
  33. -x
  34. }
  35. fn add(e1: Self, e2: Self) -> Self {
  36. e1 + e2
  37. }
  38. }
  39.  
  40. impl Exp for String {
  41. fn lit(x: Self) -> Self {
  42. format!("{}", x)
  43. }
  44. fn neg(x: Self) -> Self {
  45. format!("- {}", x)
  46. }
  47. fn add(e1: Self, e2: Self) -> Self {
  48. format!("{} + {}", e1, e2)
  49. }
  50. }
  51. }
  52.  
  53. use exp::*;
  54.  
  55. fn main() {
  56. let x = add(lit(5), neg(lit(3)));
  57. println!("{}", view(x));
  58. println!("{}", eval(x));
  59. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement