Annotation of researchv10no/cmd/sml/src/boot/fastlib.sml, revision 1.1.1.1

1.1       root        1: (* Copyright 1989 by AT&T Bell Laboratories *)
                      2: structure Fastlib = struct
                      3: 
                      4: structure Ref = 
                      5:   struct
                      6:     open Ref
                      7:     fun inc r = r := !r + 1
                      8:     fun dec r = r := !r + 1
                      9:   end
                     10: 
                     11: structure List : LIST =
                     12:   struct
                     13:     open List
                     14:     fun hd (a::r) = a | hd nil = raise Hd
                     15:     fun tl (a::r) = r | tl nil = raise Tl    
                     16:     fun null nil = true | null _ = false
                     17:     fun length l = 
                     18:        let fun j(k,nil) = k
                     19:              | j(k, a::x) = j(k+1,x)
                     20:         in j(0,l)
                     21:        end
                     22:     fun op @ (nil,l) = l
                     23:       | op @ (a::r, l) = a :: (r@l)
                     24:     fun rev l =
                     25:        let fun f (nil, h) = h
                     26:              | f (a::r, h) = f(r, a::h)
                     27:        in  f(l,nil)
                     28:        end
                     29:     fun map f =
                     30:        let fun m nil = nil
                     31:              | m (a::r) = f a :: m r
                     32:        in  m
                     33:        end
                     34:     fun fold f [] = (fn b => b)
                     35:       | fold f (a::r) = (fn b => let fun f2(e,[]) = f(e,b)
                     36:                                       | f2(e,a::r) = f(e,f2(a,r))
                     37:                                 in f2(a,r)
                     38:                                 end)
                     39:     fun revfold f [] = (fn b => b)
                     40:       | revfold f (a::r) = (fn b => let fun f2(e,[],b) = f(e,b)
                     41:                                          | f2(e,a::r,b) = f2(a,r,f(e,b))
                     42:                                    in f2(a,r,b)
                     43:                                    end)        
                     44:     fun app f = let fun a2 (e::r) = (f e; a2 r) | a2 nil = () in a2 end
                     45:     fun revapp f = let fun a2 (e::r) = (a2 r; f e; ()) | a2 nil = () in a2 end
                     46:     fun nthtail(e,0) = e 
                     47:       | nthtail(e::r,n) = nthtail(r,n-1)
                     48:       | nthtail _ = raise NthTail
                     49:     fun nth x = hd(nthtail x) handle NthTail => raise Nth | Hd => raise Nth
                     50:     fun exists pred =
                     51:        let fun f nil = false
                     52:              | f (hd::tl) = pred hd orelse f tl
                     53:        in  f
                     54:        end
                     55:   end
                     56: 
                     57: structure ByteArray  =
                     58:   struct
                     59:     open ByteArray
                     60:    local open System.Unsafe
                     61:     in
                     62:     val length = cast slength
                     63:     fun update(arg as (s,i,c)) =
                     64:        if i<0 orelse i >= slength s then raise Subscript
                     65:        else if c<0 orelse c>255 then raise Range
                     66:        else store arg
                     67:     val op sub = fn (s,i) => if i<0 orelse i>= slength s then raise Subscript
                     68:                             else ordof(s,i)
                     69:     fun extract(ba,i,1) = if i<0 orelse i >= slength ba then raise Subscript
                     70:                          else cast(ordof(ba,i))
                     71:       | extract(s,i,len) = 
                     72:          if i<0 orelse i+len > slength s orelse len<0 then raise Subscript
                     73:          else if len=0 then Assembly.bytearray0
                     74:          else let val a = Assembly.A.create_b len
                     75:                   fun copy j =  if j=len then ()
                     76:                                 else (store(a,j,ordof(s,i+j)); copy(j+1))
                     77:               in  copy 0; a
                     78:               end
                     79:     fun app f ba = 
                     80:        let val len = slength ba
                     81:            fun app' i = if i >= len then ()
                     82:                         else (f(ba sub i); app'(i+1))
                     83:        in  app' 0
                     84:        end
                     85:     fun revapp f ba = 
                     86:        let fun revapp' i = if i < 0 then ()
                     87:                            else (f(ba sub i); revapp'(i-1))
                     88:        in  revapp'(slength ba - 1)
                     89:        end
                     90:     fun fold f ba x = 
                     91:        let fun fold'(i,x) = if i < 0 then x else fold'(i-1, f(ordof(ba,i),x))
                     92:        in  fold'(slength ba - 1, x)
                     93:        end
                     94:     fun revfold f ba x = 
                     95:        let val len = slength ba
                     96:            fun revfold'(i,x) = if i >= len then x
                     97:                                else revfold'(i+1,f(ordof(ba,i),x))
                     98:        in  revfold'(0,x)
                     99:        end
                    100:     end
                    101:   end
                    102: 
                    103: 
                    104: structure String =
                    105:   struct
                    106:     open String
                    107:     local open System.Unsafe
                    108:          val op > = Integer.> and op >= = Integer.>=
                    109:          val op < = Integer.< and op <= = Integer.<=
                    110:      in
                    111:     fun length s = if boxed s then slength s else 1
                    112: 
                    113:     val size = length
                    114:     fun substring("",0,0) = "" (* never call create_s with 0 *)
                    115:       | substring("",_,_) = raise Substring
                    116:       | substring(s,i,0) = if i>=0 
                    117:                            then if boxed s then if i <= slength s
                    118:                                                 then "" else raise Substring
                    119:                                            else if i<=1 
                    120:                                                 then "" else raise Substring
                    121:                            else raise Substring
                    122:       | substring(s,0,1) = if boxed s then cast(ordof(s,0)) else s
                    123:       | substring(s,i,1) =
                    124:             if boxed s then if i>=0 andalso i < slength s 
                    125:                                    then cast(ordof(s,i))
                    126:                                    else raise Substring
                    127:                        else if i=0 then s else raise Substring
                    128:       | substring(s,i,len) = 
                    129:          if boxed s andalso i>=0 andalso i+len <= slength s
                    130:                andalso len >= 0
                    131:          then let val a = Assembly.A.create_s(len)
                    132:                   fun copy j = if j=len then ()
                    133:                                else (store(a,j,ordof(s,i+j)); copy(j+1))
                    134:               in  copy 0; a
                    135:               end
                    136:          else raise Substring
                    137: 
                    138:     fun explode s =
                    139:          if boxed s
                    140:            then let fun f(l,~1) = l
                    141:                       | f(l, i) = f(cast(ordof(s,i)) :: l, i-1)
                    142:                  in f(nil, slength s - 1)
                    143:                 end
                    144:            else [s]
                    145:     fun op ^ ("",s) = s
                    146:       | op ^ (s,"") = s
                    147:       | op ^ (x,y) =
                    148:          if boxed x 
                    149:          then if boxed y
                    150:               then let val xl = slength x and yl = slength y
                    151:                        val a = Assembly.A.create_s(xl+yl)
                    152:                        fun copyx n = if n=xl then ()
                    153:                              else (store(a,n,ordof(x,n)); copyx(n+1))
                    154:                        fun copyy n = if n=yl then ()
                    155:                              else (store(a,xl+n,ordof(y,n)); copyy(n+1))
                    156:                     in copyx 0; copyy 0; a
                    157:                    end
                    158:              else let val xl = slength x
                    159:                       val a = Assembly.A.create_s(xl+1)
                    160:                        fun copyx n = if n=xl then ()
                    161:                              else (store(a,n,ordof(x,n)); copyx(n+1))
                    162:                    in copyx 0; store(a,xl,cast y); a
                    163:                   end
                    164:          else if boxed y                      
                    165:               then let val yl = slength y
                    166:                        val a = Assembly.A.create_s(1+yl)
                    167:                        fun copyy n = if n=yl then ()
                    168:                              else (store(a,1+n,ordof(y,n)); copyy(n+1))
                    169:                     in store(a,0,cast x); copyy 0; a
                    170:                    end
                    171:              else let val a = Assembly.A.create_s 2
                    172:                    in store(a,0,cast x); store(a,1,cast y); a
                    173:                   end
                    174:     fun chr i = if i<0 orelse i>255 then raise Chr else cast i
                    175:     fun ord "" = raise Ord
                    176:       | ord s = if boxed s then ordof(s,0) else cast s
                    177:     val ordof = fn (s,i) =>
                    178:          if boxed s
                    179:             then if i<0 orelse i>= slength s then raise Ord else ordof(s,i)
                    180:            else if i=0 then cast s else raise Ord
                    181:     fun implode (sl:string list) =
                    182:          let val len = List.fold(fn(s,l) => length s + l) sl 0
                    183:          in  case len
                    184:               of 0 => ""
                    185:                | 1 => let fun find (""::tl) = find tl
                    186:                             | find (hd::_) = cast hd
                    187:                             | find nil = "" (* impossible *)
                    188:                       in  find sl
                    189:                       end
                    190:                | _ => let val new = Assembly.A.create_s len
                    191:                           fun copy (nil,_) = ()
                    192:                             | copy (s::tl,base) =
                    193:                                let val len = length s
                    194:                                    fun copy0 0 = ()
                    195:                                      | copy0 i =
                    196:                                        let val next = i-1
                    197:                                        in  store(new,base+next,ordof(s,next));
                    198:                                            copy0 next
                    199:                                        end
                    200:                                in  copy0 len;
                    201:                                    copy(tl,base+len)
                    202:                                end
                    203:                        in  copy(sl,0);
                    204:                            new
                    205:                        end
                    206:          end
                    207:     end (* local *)
                    208:   end  (* structure String *)
                    209: 
                    210: structure General =
                    211:   struct
                    212:     open General
                    213:     fun f o g = fn x => f(g x)
                    214:     fun a before b = a
                    215:   end (* structure General *)
                    216: 
                    217: structure Array =
                    218:   struct
                    219:    open Array
                    220:    local open System.Unsafe in
                    221:     val op sub : 'a array * int -> 'a =
                    222:          fn (a,i) =>
                    223:             if i<0 orelse i >= length a then raise Subscript
                    224:             else subscript(a,i)
                    225:     val update : 'a array * int * 'a -> unit =
                    226:          fn (a,i,v) => 
                    227:             if i<0 orelse i >= length a then raise Subscript
                    228:             else update(a,i,v)
                    229:    end (* local open ... *)
                    230:   end (* structure Array *)
                    231: 
                    232: structure Integer =
                    233:   struct
                    234:     open Integer
                    235:     fun op mod(a:int,b:int):int = a-((a div b) * b)
                    236:     fun min(a,b) = if a<b then a else b
                    237:     fun max(a,b) = if a>b then a else b
                    238:     fun abs a = if a<0 then ~a else a
                    239:   end
                    240: 
                    241:  val inc = Ref.inc
                    242:  val dec = Ref.dec
                    243:  val hd = List.hd and tl = List.tl
                    244:  val null = List.null and length = List.length
                    245:  val op @ = List.@ and rev = List.rev
                    246:  val map = List.map and fold = List.fold and revfold=List.revfold
                    247:  val app = List.app and revapp = List.revapp
                    248:  val nthtail = List.nthtail and nth = List.nth and exists = List.exists
                    249:  val substring = String.substring and explost = String.explode
                    250:  val op ^ = String.^ and chr = String.chr and ord = String.ord
                    251:  val implode=String.implode
                    252:  val op o = General.o and op before = General.before
                    253:  val op sub = Array.sub and update= Array.update
                    254:  val min = Integer.min and max = Integer.max 
                    255: 
                    256: end

unix.superglobalmegacorp.com

This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.