metasepi / idiomaticca

Translate IDIOMATIC C into human-readable ATS
http://metasepi.org/
GNU Affero General Public License v3.0
3 stars 0 forks source link

Translate regress/noinc/loop_while #17

Closed master-q closed 5 years ago

master-q commented 5 years ago

Fibonacci is a good example?

master-q commented 5 years ago

We should convert loop into recursion:

master-q commented 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
master-q commented 5 years ago

There are choices:

  1. Introduce {l,r}-value flag
  2. Change any r-value to l-value after introducing, such as match tuple / function define
master-q commented 5 years ago

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
master-q commented 5 years ago

Need to modify interpretStatementExp :: C.CStat -> State IEnv (A.Expression Pos) for let in end.

master-q commented 5 years ago

Supported at 1be1bdc4c2930ffc53f47fff3f2e37872e568cab.