Consider following functions(only for asking question) foo_1 and foo_2 :
(* for convenience assume n > 0 *)
extern
fun
foo_1{n:nat | n > 0}
(A : &(@[int][n])) : void
(* for convenience assume n > 0 *)
extern
fun
foo_2{n:nat | n > 0}{l:addr}
(pf : !array_v(int,l,n) | p : ptr (l) ) : void
implement
foo_1{n}(A) =
let
val () = println! (A[0])
val p = addr@A
prval avw = view@A
val () = foo_2(avw | p)
prval () = view@A := avw
in end
implement
foo_2{n}{l} (pf | p) =
let
(* val () = foo_1 (?????) *)
prval (pf_at,pf_rest) = array_v_uncons(pf)
val x = ptr_get<int>(pf_at | p)
val () = println! (x)
prval () = pf := array_v_cons(pf_at,pf_rest)
in end
They are called from main0 :
implement main0 () = {
var tarr = @[int][10](100)
val () = foo_1(tarr)
val (pf | p) = (view@tarr | addr@tarr)
val () = foo_2(pf | p)
prval () = view@tarr := pf
}
The parameters to both functions are reference to an array type one is implicit other is explicit (Am I right ??? ).
In foo_1 I can simply use A[i] to access values of array A.
But I can't do so in foo_2 , so from given arguments of foo_2 , how do I create a binding
say B so that I can use B[i] in foo_2 function using cast or anything else ?
Say I want to call foo_1 from foo_2 , so how would I do that ?
Thanks