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

Support break in loop #32

Closed master-q closed 5 years ago

master-q commented 5 years ago

https://www.tutorialspoint.com/cprogramming/c_break_statement

master-q commented 5 years ago
int while_break() {
    int a = 10, b = 10;

    while(a < 20) {
        a++;
        if (a > 15) {
            break;
        }
        b++;
    }

    return a + b;
}

int main() {
    return while_break() - 16 - 15;
}

should be translated into...

#include "share/atspre_staload.hats"

fun for_break (): int =
  let
    var a: int = 10
    var b: int = 10

    fun loop_while(a : int, b : int) : (int, int) =
      let
        var a: int = a
        var b: int = b
      in
        if a < 20 then
          let
            val () = a := a + 1
          in
            if a > 15 then
              (a, b)
            else let
              val () = b := b + 1
            in
              loop_while(a, b)
            end
          end
        else
          (a, b)
      end

    val (i9a_a, i9a_b) = loop_while(a, b)
    val () = a := i9a_a
    val () = b := i9a_b
  in
    a + b
  end

implement main () =
  for_break() - 16 - 15
master-q commented 5 years ago

Umm... We need simplify stage...

master-q commented 5 years ago

It may become simple code using case.

master-q commented 5 years ago

Choice A:

Modify (A.ATS $ postCondE ++ decls ++ fromMaybe [] incr'') includes (* CBreak *) comment at makeLoop function

master-q commented 5 years ago

Choice B:

Modify C.CStat and remove any break, continue and goto

master-q commented 5 years ago

Take A.