Closed master-q closed 5 years ago
int fib(int n) {
int f0 = 0, f1 = 1;
while (n-- > 0) {
int tmp = f1;
f1 = f0 + f1;
f0 = tmp;
};
return f0;
}
int main() {
return fib(10) - 55;
}
should be translated into:
#include "share/atspre_staload.hats"
fun fib (n: int): int =
let
var f0: int = 0
var f1: int = 1
fun fib_loop (n: int, f1: int, f0: int): (int, int, int) =
if n > 0 then let
var n = n - 1
var tmp: int = f1
var f1 = f0 + f1
var f0 = tmp
in
fib_loop (n, f1, f0)
end
else
(n, f1, f0)
val (n, f1, f0) = fib_loop (n, f1, f0)
in
f0
end
implement main () =
let
in
fib(10) - 55
end
There are choices:
Example 2 is following:
#include "share/atspre_staload.hats"
fun fib (n: int): int =
let
var n: int = n
var f0: int = 0
var f1: int = 1
fun fib_loop (n: int, f1: int, f0: int): (int, int, int) =
let
var n: int = n
var f1: int = f1
var f0: int = f0
in
if n > 0 then let
val () = n := n - 1
var tmp: int = f1
val () = f1 := f0 + f1
val () = f0 := tmp
in
fib_loop (n, f1, f0)
end
else
(n, f1, f0)
end
val (n', f1', f0') = fib_loop (n, f1, f0)
val () = n := n'
val () = f1 := f1'
val () = f0 := f0'
in
f0
end
implement main () =
let
in
fib(10) - 55
end
Need to modify interpretStatementExp :: C.CStat -> State IEnv (A.Expression Pos)
for let in end
.
Supported at 1be1bdc4c2930ffc53f47fff3f2e37872e568cab.
Fibonacci is a good example?