|
|
1.1 ! root 1: (* Copyright 1989 by AT&T Bell Laboratories *) ! 2: signature STATIC_ARRAY = sig type array ! 3: exception Subscript ! 4: type elem ! 5: val array : int * elem -> array ! 6: val sub : array * int -> elem ! 7: val update : (array * int * elem) -> unit ! 8: val length : array -> int ! 9: end ! 10: ! 11: signature DYNAMIC_ARRAY = sig type array ! 12: exception Subscript ! 13: type elem ! 14: val array : elem -> array ! 15: val sub : array * int -> elem ! 16: val update : (array * int * elem) -> unit ! 17: end ! 18: ! 19: functor Dynamic( A : STATIC_ARRAY ) : DYNAMIC_ARRAY = ! 20: struct ! 21: type array = {default: A.elem, arr: A.array ref} ! 22: type elem = A.elem ! 23: exception Subscript ! 24: fun array e = {default=e, arr= ref(A.array(0,e))}; ! 25: fun {default, arr as ref a} sub i = ! 26: A.sub(a,i) ! 27: handle A.Subscript => ! 28: if i < 0 then raise Subscript ! 29: else default ! 30: fun update ({default,arr as ref a}, i, e) = ! 31: A.update(a,i,e) ! 32: handle A.Subscript => ! 33: if i<0 then raise Subscript ! 34: else ! 35: let val size = A.length a ! 36: val newsize = i + size + 1 ! 37: val a2 = A.array(newsize, default) ! 38: fun copy j = (A.update(a2,j,A.sub(a,j)); copy(j-1)) ! 39: in (copy (size - 1) handle A.Subscript => ()); ! 40: arr := a2; ! 41: A.update(a2,i,e) ! 42: end ! 43: ! 44: end ! 45: ! 46:
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.