struct Rec {
unRec: @fn(Rec) -> A
}
fn fix(f: @fn(@fn(A) -> B) -> @fn(A) -> B) -> @fn(A) -> B {
let k: @fn(r: Rec<@fn(A) -> B>) -> @fn(A) -> B =
|r| |x| f((r.unRec)(r))(x);
k(Rec { unRec: k })
}
fn main() {
let fac = fix (|me|
|x: int|
if x == 0 { 1 }
else { x * me(x - 1) }
);
println(fmt!("%d", fac(5)));
}