Home My Page Projects Code Snippets Project Openings SML/NJ
Summary Activity Forums Tracker Lists Tasks Docs Surveys News SCM Files

SCM Repository

[smlnj] Annotation of /sml/trunk/src/compiler/PervEnv/Basis/vector.sml
ViewVC logotype

Annotation of /sml/trunk/src/compiler/PervEnv/Basis/vector.sml

Parent Directory Parent Directory | Revision Log Revision Log


Revision 114 - (view) (download)

1 : monnier 89 (* vector.sml
2 :     *
3 :     * COPYRIGHT (c) 1994 AT&T Bell Laboratories.
4 :     *
5 :     *)
6 :    
7 :     structure Vector : VECTOR =
8 :     struct
9 :    
10 :     val (op +) = InlineT.DfltInt.+
11 :     val (op <) = InlineT.DfltInt.<
12 :     val (op >=) = InlineT.DfltInt.>=
13 :    
14 :     type 'a vector = 'a PrimTypes.vector
15 :    
16 :     val maxLen = Core.max_length
17 :    
18 :     fun checkLen n = if InlineT.DfltInt.ltu(maxLen, n) then raise General.Size else ()
19 :    
20 :     fun fromList l = let
21 :     fun len ([], n) = n
22 :     | len ([_], n) = n+1
23 :     | len (_::_::r, n) = len(r, n+2)
24 :     val n = len (l, 0)
25 :     in
26 :     checkLen n;
27 :     if (n = 0)
28 :     then Assembly.vector0
29 :     else Assembly.A.create_v(n, l)
30 :     end
31 :    
32 :     fun tabulate (0, _) = Assembly.vector0
33 :     | tabulate (n, f) = let
34 :     val _ = checkLen n
35 :     fun tab i = if (i = n) then [] else (f i)::tab(i+1)
36 :     in
37 :     Assembly.A.create_v(n, tab 0)
38 :     end
39 :    
40 :     val length : 'a vector -> int = InlineT.PolyVector.length
41 :     val sub : 'a vector * int -> 'a = InlineT.PolyVector.chkSub
42 :    
43 :     (* a utility function *)
44 :     fun rev ([], l) = l
45 :     | rev (x::r, l) = rev (r, x::l)
46 :    
47 :     fun extract (v, base, optLen) = let
48 :     val len = length v
49 :     fun newVec n = let
50 :     fun tab (~1, l) = Assembly.A.create_v(n, l)
51 :     | tab (i, l) = tab(i-1, InlineT.PolyVector.sub(v, base+i)::l)
52 :     in
53 :     tab (n-1, [])
54 :     end
55 :     in
56 :     case (base, optLen)
57 :     of (0, NONE) => v
58 :     | (_, SOME 0) => if ((base < 0) orelse (len < base))
59 :     then raise General.Subscript
60 :     else Assembly.vector0
61 :     | (_, NONE) => if ((base < 0) orelse (len < base))
62 :     then raise General.Subscript
63 :     else if (len = base)
64 :     then Assembly.vector0
65 :     else newVec (len - base)
66 :     | (_, SOME n) =>
67 :     if ((base < 0) orelse (n < 0) orelse (len < (base+n)))
68 :     then raise General.Subscript
69 :     else newVec n
70 :     (* end case *)
71 :     end
72 :    
73 :     fun concat [v] = v
74 :     | concat vl = let
75 :     (* get the total length and flatten the list *)
76 :     fun len ([], n, l) = (checkLen n; (n, rev(l, [])))
77 :     | len (v::r, n, l) = let
78 :     val n' = InlineT.PolyVector.length v
79 :     fun explode (i, l) = if (i < n')
80 :     then explode(i+1, InlineT.PolyVector.sub(v, i)::l)
81 :     else l
82 :     in
83 :     len (r, n + n', explode(0, l))
84 :     end
85 :     in
86 :     case len (vl, 0, [])
87 :     of (0, _) => Assembly.vector0
88 :     | (n, l) => Assembly.A.create_v(n, l)
89 :     (* end case *)
90 :     end
91 :    
92 :     fun app f vec = let
93 :     val len = length vec
94 :     fun app i = if (i < len)
95 :     then (f (InlineT.PolyVector.sub(vec, i)); app(i+1))
96 :     else ()
97 :     in
98 :     app 0
99 :     end
100 :    
101 :     fun map f vec = let
102 :     val len = length vec
103 :     fun mapf (i, l) = if (i < len)
104 :     then mapf (i+1, f (InlineT.PolyVector.sub(vec, i)) :: l)
105 :     else Assembly.A.create_v(len, rev(l, []))
106 :     in
107 :     if (len > 0)
108 :     then mapf (0, [])
109 :     else Assembly.vector0
110 :     end
111 :    
112 :     fun foldl f init vec = let
113 :     val len = length vec
114 :     fun fold (i, accum) = if (i < len)
115 :     then fold (i+1, f (InlineT.PolyVector.sub(vec, i), accum))
116 :     else accum
117 :     in
118 :     fold (0, init)
119 :     end
120 :    
121 :     fun foldr f init vec = let
122 :     fun fold (i, accum) = if (i >= 0)
123 :     then fold (i-1, f (InlineT.PolyVector.sub(vec, i), accum))
124 :     else accum
125 :     in
126 :     fold (length vec - 1, init)
127 :     end
128 :    
129 :     fun chkSlice (vec, i, NONE) = let val len = length vec
130 :     in
131 :     if (InlineT.DfltInt.ltu(len, i))
132 :     then raise Subscript
133 :     else (vec, i, len)
134 :     end
135 :     | chkSlice (vec, i, SOME n) = let val len = length vec
136 :     in
137 :     if ((0 <= i) andalso (0 <= n) andalso (i+n <= len))
138 :     then (vec, i, i+n)
139 :     else raise Subscript
140 :     end
141 :    
142 :     fun appi f slice = let
143 :     val (vec, start, stop) = chkSlice slice
144 :     fun app i = if (i < stop)
145 :     then (f (i, InlineT.PolyVector.sub(vec, i)); app(i+1))
146 :     else ()
147 :     in
148 :     app start
149 :     end
150 :    
151 :     fun mapi f slice = let
152 :     val (vec, start, stop) = chkSlice slice
153 :     val len = stop-start
154 :     fun mapf (i, l) = if (i < stop)
155 :     then mapf (i+1, f (i, InlineT.PolyVector.sub(vec, i)) :: l)
156 :     else Assembly.A.create_v(len, rev(l, []))
157 :     in
158 :     if (len > 0)
159 :     then mapf (start, [])
160 :     else Assembly.vector0
161 :     end
162 :    
163 :     fun foldli f init slice = let
164 :     val (vec, start, stop) = chkSlice slice
165 :     fun fold (i, accum) = if (i < stop)
166 :     then fold (i+1, f (i, InlineT.PolyVector.sub(vec, i), accum))
167 :     else accum
168 :     in
169 :     fold (start, init)
170 :     end
171 :    
172 :     fun foldri f init slice = let
173 :     val (vec, start, stop) = chkSlice slice
174 :     fun fold (i, accum) = if (i >= start)
175 :     then fold (i-1, f (i, InlineT.PolyVector.sub(vec, i), accum))
176 :     else accum
177 :     in
178 :     fold (stop - 1, init)
179 :     end
180 :    
181 :     end (* Vector *)
182 :    
183 :    
184 :     (*
185 : monnier 113 * $Log$
186 : monnier 89 *)

root@smlnj-gforge.cs.uchicago.edu
ViewVC Help
Powered by ViewVC 1.0.0