Please try the following code:
#include “share/atspre_define.hats”
#include “share/atspre_staload.hats”
%{^
struct foo {
int a;
int *p;
};
struct foo foo_var;
%}
absvt@ype struct_foo
vtypedef struct_foo_impl = $extype_struct"struct foo" of {
a = int,
p = [l:addr] (int@l | ptr l)
}
vtypedef pstruct_foo = [l:addr] (struct_foo@l | ptr(l))
assume struct_foo = struct_foo_impl
macdef takeout_pstruct_foo = $extval(pstruct_foo, “&foo_var”)
extern praxi addback_pstruct_foo (pstruct_foo): void
implement main0 () = {
val (pf | p) = takeout_pstruct_foo
// val () = foo.a := 1 // error(3): a non-proof component is replaced of
the type[S2Ecst(int)].
val () = println! !p.a
// val () = println! foo.p // error(3): the symbol [print] cannot be
resolved as no match is found.
prval () = addback_pstruct_foo @(pf | p)
}
I put a running version here:
https://github.com/githwxi/ATS-Postiats-test/blob/master/contrib/hwxi/TEST30/test39.datsOn Friday, August 19, 2016 at 8:56:08 PM UTC-4, Kiwamu Okabe wrote:
Hi all,
I’m writing following code, because seeking better way to use global
struct.https://github.com/jats-ug/practice-ats/blob/master/extval/main.dats
#include "share/atspre_define.hats" #include "share/atspre_staload.hats" %{^ struct foo { int a; int *p; }; struct foo foo_var; %} absvt@ype struct_foo vtypedef struct_foo_impl = $extype_struct"struct foo" of { a = int, p = [l:addr] (int@l | ptr l) } assume struct_foo = struct_foo_impl macdef takeout_struct_foo = $extval(struct_foo, "foo_var") extern praxi addback_struct_foo (struct_foo): void implement main0 () = { val foo = takeout_struct_foo // val () = foo.a := 1 // error(3): a non-proof component is replaced of the type[S2Ecst(int)]. val () = println! foo.a // val () = println! foo.p // error(3): the symbol [print] cannot be resolved as no match is found. prval () = addback_struct_foo foo }
However, the code can’t touch the member of the struct.
Is it non-sense code?Best regards,
Kiwamu Okabe at METASEPI DESIGN