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 simple pointer example #20

Closed master-q closed 5 years ago

master-q commented 5 years ago
$ cat regress/noinc/pointer_simple/main.c
int main() {
        int x = 1, y = 2;
        int *ip;

        ip = &x;
        y = *ip;

        return y - 1;
}

should be translated into following:

#include "share/atspre_staload.hats"

implement main () =
  let
    var x: int = 1
    var y: int = 2
    var ip: ptr
    val () = ip := addr@x
    val () = y := !ip
  in
    y - 1
  end
master-q commented 5 years ago
void swap(int *px, int *py) {
    int temp;

    temp = *px;
    *px = *py;
    *py = temp;
}

int main() {
    int x = 1, y = 2;
    int *px;

    px = &x;
    swap(px, &y);

    return x * 10 + y - 21;
}

should be translated into following:

#include "share/atspre_staload.hats"

fun swap {l1,l2:addr} (i9apf_px: !int@l1, i9apf_py: !int@l2 | px: ptr l1, py: ptr l2): void =
  let
    var temp: int
    val () = temp := !px
    val () = !px := !py
    val () = !py := temp
  in
  end

implement main () =
  let
    var x: int = 1
    var y: int = 2
    var px: ptr
    val () = px := addr@x
    val () = swap(view@x, view@y | px, addr@y)
  in
    x * 10 + y - 21
  end
master-q commented 5 years ago

ill-typed PrfArg???

http://hackage.haskell.org/package/language-ats-1.7.1.2/docs/Language-ATS.html#t:Arg

Arg (Paired String (Type a))
PrfArg [Arg a] (Arg a)
master-q commented 5 years ago

may be translated into following using viewtype:

#include "share/atspre_staload.hats"

vtypedef tptr (a:t@ype, l:addr) = (a @ l | ptr l)

fun swap {l1,l2:addr} (px: !tptr(int, l1), py: !tptr(int, l2)): void =
  let
    var temp: int
    val () = temp := !(px.1)
    val () = !(px.1) := !(py.1)
    val () = !(py.1) := temp
  in
  end

implement main () =
  let
    var x: int = 1
    var y: int = 2
    val xp = (view@x | addr@x)
    val yp = (view@y | addr@y)
    val () = swap(xp, yp)
    prval () = view@x := xp.0
    prval () = view@y := yp.0
  in
    x * 10 + y - 21
  end

But language-ats parser can't eat above:

$ stack run dumpats ~/tmp/ats/idiomaticca/main.dats
Unknown (Keyword (AlexPn 453 21 16) KwViewAt)
idiomaticca: Prelude.undefined

I think the parser doesn't understand prval () = view@x := xp.0.

master-q commented 5 years ago

I believe capsulation using vtypedef tuple is a special case.

master-q commented 5 years ago

Should test for a function has three arguments.