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_for #21

Closed master-q closed 5 years ago

master-q commented 5 years ago
$ cat regress/noinc/loop_for/main.c
int sum(int n) {
        int i, sum = 0;

        for (i = 1; i <= n; i++) {
                sum = sum + i;
        }

        return sum;
}

int main() {
        return sum(5) - 15;
}

should be translated into following:

$ cat main.dats 
#include "share/atspre_staload.hats"

fun sum (n: int): int =
  let
    var n: int = n
    var i: int
    var sum: int = 0

    fun sum_loop (n: int, i: int, sum: int): (int, int, int) =
      let
        var n: int = n
        var i: int = i
        var sum: int = sum
      in
        if i <= n then let
            val () = sum := sum + i
            val () = i := i + 1
          in
            sum_loop(n, i, sum)
          end
        else
          (n, i, sum)
      end

    val () = i := 1
    val (n', i', sum') = sum_loop(n, i, sum)
    val () = n := n'
    val () = i := i'
    val () = sum := sum'
  in
    sum
  end

implement main () =
  let
  in
    sum(5) - 15
  end
master-q commented 5 years ago

Support at 3b2875c8bdf3a7fd751c180afd758bb076817ea7. But duplicated with C.CWhile.

master-q commented 5 years ago

Fixed at 4865b1858e8e3061cd7082967a5e2814f8aebc3c.