Skip to content

Instantly share code, notes, and snippets.

@megakorre
Created August 9, 2012 19:46
Show Gist options
  • Star 1 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save megakorre/3307450 to your computer and use it in GitHub Desktop.
Save megakorre/3307450 to your computer and use it in GitHub Desktop.
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()));
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment