public
Created

  • Download Gist
code-example.rs
Rust
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66
mod enum_mod {
export run;
 
enum expr {
val(int),
plus(&expr, &expr),
minus(&expr, &expr)
}
fn eval(e: &expr) -> int {
alt *e {
val(i) => i,
plus(a,b) => eval(a) + eval(b),
minus(a,b) => eval(a) - eval(b)
}
}
fn run() {
let x = eval(
 
&minus(&val(5),
&plus(&val(3), &val(1))));
io::println(#fmt("val: %i", x));
}
}
 
trait Expr {
fn eval() -> int;
}
 
 
enum plus<T:Expr,T2:Expr> =
(T,T2);
enum minus<T:Expr,T2:Expr> =
(T,T2);
 
 
impl plus_expr<T:Expr,T2:Expr> of Expr for plus<T,T2> {
fn eval() -> int {
alt self {
plus((ref a, ref b)) => a.eval() + b.eval()
}
}
}
 
 
impl minus_expr<T:Expr,T2:Expr> of Expr for minus<T,T2> {
fn eval() -> int {
alt self {
minus((ref a, ref b)) => a.eval() - b.eval()
}
}
}
 
impl of Expr for int {
fn eval() -> int { self }
}
 
 
fn main() {
enum_mod::run();
let v = minus((5, plus((3, 1))));
io::println(#fmt("%i", v.eval()));
 
}

Please sign in to comment on this gist.

Something went wrong with that request. Please try again.