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
 [smlnj] / sml / trunk / src / compiler / PervEnv / Basis / vector.sml

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

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