Matrix initialization example in ATS

Run Settings
LanguageATS
Language Version
Run Command
staload "share/atspre_staload.hats" staload _ = "prelude/DATS/integer.dats" staload _ = "prelude/DATS/pointer.dats" staload _ = "prelude/DATS/array.dats" staload _ = "prelude/DATS/matrix.dats" staload _ = "prelude/DATS/pointer.dats" staload _ = "prelude/DATS/reference.dats" staload _ = "prelude/DATS/unsafe.dats" // used by matrix functions extern fun multable_init ( mat: &(@[@[int][10]][10])? >> _ ): void // end of [multable_init] // (* ****** ****** *) // implement multable_init (m) = { // #define NCOL 10 #define NROW 10 typedef T = int typedef COL_T = @[T][NCOL] // fun aux_col {lres:addr} ( pf_res: !COL_T? @ lres >> COL_T @ lres | pres: ptr lres, i: natLt(NCOL) ): void = { // var j: int = 0 var p = pres prvar pf0 = array_v_nil {T} () prvar pf1 = pf_res // val () = while* {j:nat | j <= NROW} .<NROW-j>. ( j: int (j) , p: ptr (lres + j*sizeof(T)) , pf0: array_v (T, lres, j) , pf1: array_v (T?, lres+j*sizeof(T), NROW-j) ) : ( pf0: array_v (T, lres, NROW) , pf1: array_v (T?, lres+j*sizeof(T), 0) ) => ( j < NROW ) { // prval (pf_at, pf1_res) = array_v_uncons {T?} (pf1) prval () = pf1 := pf1_res // val () = ptr_set<T> (pf_at | p, (g0ofg1)(i * j)) val () = p := ptr1_succ<T> (p) // prval () = pf0 := array_v_extend {T} (pf0, pf_at) val () = j := j + 1 // } // end of [val] // prval () = pf_res := pf0 prval () = array_v_unnil {T?} (pf1) // } (* end of [loop] *) // fun aux {lres:addr} ( pf_res : !(@[COL_T?][NCOL] @ lres) >> @[COL_T][NCOL] @ lres | pres: ptr lres ): void = { // var i: int = 0 var p = pres prvar pf0 = array_v_nil {COL_T} () prvar pf1 = pf_res // val () = while* {i:nat | i <= NCOL} .<NCOL-i>. ( i: int (i) , p: ptr (lres + i*(NCOL*sizeof(T))) , pf0: array_v (COL_T, lres, i) , pf1: array_v (COL_T?, lres+i*sizeof(COL_T), NCOL-i) ) : ( pf0: array_v (COL_T, lres, NCOL) , pf1: array_v (COL_T?, lres+i*sizeof(COL_T), 0) ) => ( i < NCOL ) { // prval (pf_at, pf1_res) = array_v_uncons {COL_T?} (pf1) prval () = pf1 := pf1_res // prval () = __trustme () where { extern prfun __trustme (): [i * (NROW * sizeof(T)) == i * sizeof(@[T][NROW])] void } // val () = aux_col (pf_at | p, i) // // val () = p := ptr_add<T> (p, NCOL) // prval () = pf0 := array_v_extend {COL_T} (pf0, pf_at) val () = i := i + 1 // } // end of [val] // prval () = pf_res := pf0 prval () = array_v_unnil {COL_T?} (pf1) // } (* end of [aux] *) // val () = aux (view@m | addr@m) // } (* end of [multable_init] *) var multable : @[int?][100] val p_multable = addr@multable prval pf_multable = array_v_group (view@multable) val () = multable_init (!p_multable) prval pf_multable = array_v_ungroup (pf_multable) prval pf_multable = array2matrix_v (pf_multable) val theMultable = ref_make_viewptr {matrix (int, 10, 10)} (pf_multable | p_multable) implement main0 () = let val (pf_multab, fpf | p_multab) = $effmask_ref (ref_vtakeout (theMultable)) val res = matrix_get_at_int (!p_multab, 3, 10, 4) val () = println!("the result of 3 * 4 = ", res) val res = matrix_get_at_int (!p_multab, 4, 10, 7) val () = println!("the result of 4 * 7 = ", res) prval () = fpf (pf_multab) in end
Editor Settings
Theme
Key bindings
Full width
Lines