Closed master-q closed 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
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)
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
.
I believe capsulation using vtypedef
tuple is a special case.
Should test for a function has three arguments.
should be translated into following: