/
chap_arrayref.dats
103 lines (93 loc) · 1.8 KB
/
chap_arrayref.dats
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
(*
** For ATS2TUTORIAL
*)
(* ****** ****** *)
//
#include
"share/atspre_staload.hats"
//
(* ****** ****** *)
fun{a:t@ype}
arrayref_reverse{n:nat}
(
A: arrayref (a, n), n: size_t (n)
) : void = let
//
fun loop
{i: nat | i <= n} .<n-i>.
(
A: arrayref (a, n), n: size_t n, i: size_t i
) : void = let
val n2 = half (n)
in
if i < n2 then let
val tmp = A[i]
val ni = pred(n)-i
in
A[i] := A[ni]; A[ni] := tmp; loop (A, n, succ(i))
end else () // end of [if]
end // end of [loop]
//
in
loop (A, n, i2sz(0))
end // end of [arrayref_reverse]
(* ****** ****** *)
fun{a:vt@ype}
arrayref_reverse{n:nat}
(
A: arrayref (a, n), n: size_t (n)
) : void = let
//
fun loop
{i: nat | i <= n} .<n-i>.
(
A: arrayref (a, n), n: size_t n, i: size_t i
) : void = let
val n2 = half (n)
in
if i < n2 then let
val () = arrayref_interchange (A, i, pred(n)-i) in loop (A, n, succ(i))
end else () // end of [if]
end // end of [loop]
//
in
loop (A, n, i2sz(0))
end // end of [arrayref_reverse]
(* ****** ****** *)
fun{a,b:t@ype}
arrayref_foldleft{n:int}
(
f: (a, b) -> a, x: a, A: arrayref (b, n), n: size_t(n)
) : a =
(
if n > 0
then arrayref_foldleft<a,b> (f, f (x, A.head()), A.tail(), pred(n))
else x
// end of [if]
) (* end of [arrayref_foldleft] *)
(* ****** ****** *)
//
val asz = i2sz(10)
val out = stdout_ref
//
local
implement
array_tabulate$fopr<int> (i) = sz2i(i)
in (* in-of-local *)
val A0 = arrayref_tabulate<int> (asz)
end // end of [local]
//
val () = fprint! (out, "A0(bef) = ")
val () = fprint_arrayref (out, A0, asz)
val () = fprint_newline (out)
//
val () = arrayref_reverse (A0, asz)
//
val () = fprint! (out, "A0(aft) = ")
val () = fprint_arrayref (out, A0, asz)
val () = fprint_newline (out)
//
(* ****** ****** *)
implement main0 () = {}
(* ****** ****** *)
(* end of [chap_arrayref.dats] *)