:eval.. let fac [r1:%] (n : Int r1) {Read r1 + Alloc r1 | Use r1} : Int r1 = letregion r2 with { w : Mutable r2 } in let acc = 1 [r2] () in let one = 1 [r2] () in letrec { loop (i : Int r1) { Read r1 + Read r2 + Write r2 + Alloc r1 + Alloc r2 | Use r1 + Use r2 } : Int r1 = case i of { 0 -> copyInt [:r2 r1:] acc; 1 -> copyInt [:r2 r1:] acc; _ -> let _ = updateInt [:r2 r2:] acc (mulInt [:r2 r1 r2:] acc i) in loop (subInt [:r1 r2 r1:] i one); } } in loop n in fac [R0#] (10 [R0#] ());;