1 (* Title: Pure/basis.ML
3 Author: Lawrence C Paulson, Cambridge University Computer Laboratory
4 Copyright 1993 University of Cambridge
6 Basis Library emulation.
8 Needed for Poly/ML and Standard ML of New Jersey version 0.93 to 1.08.
10 Full compatibility cannot be obtained using a file: what about char constants?
17 fun toString true = "true"
18 | toString false = "false"
26 datatype 'a option = NONE | SOME of 'a
28 fun getOpt (SOME v, _) = v
29 | getOpt (NONE, a) = a
31 fun isSome (SOME _) = true
34 fun valOf (SOME v) = v
35 | valOf NONE = raise Option
41 fun toString (i: int) = makestring i;
42 fun max (x, y) = if x < y then y else x : int;
43 fun min (x, y) = if x < y then x else y : int;
51 fun last [] = raise Empty
53 | last (x::xs) = last xs;
56 let fun h [] _ = raise Subscript
57 | h (x::xs) n = if n=0 then x else h xs (n-1)
58 in if n<0 then raise Subscript else h xs n end;
62 | h [] n = raise Subscript
63 | h (x::xs) n = h xs (n-1)
64 in if n<0 then raise Subscript else h xs n end;
68 | h [] n = raise Subscript
69 | h (x::xs) n = x :: h xs (n-1)
70 in if n<0 then raise Subscript else h xs n end;
73 | concat (l::ls) = l @ concat ls;
75 fun mapPartial f [] = []
76 | mapPartial f (x::xs) =
77 (case f x of Option.NONE => mapPartial f xs
78 | Option.SOME y => y :: mapPartial f xs);
80 fun find _ [] = Option.NONE
81 | find p (x :: xs) = if p x then Option.SOME x else find p xs;
84 (*copy the list preserving elements that satisfy the predicate*)
86 | filter p (x :: xs) = if p x then x :: filter p xs else filter p xs;
88 (*Partition list into elements that satisfy predicate and those that don't.
89 Preserves order of elements in both lists.*)
90 fun partition (p: 'a->bool) (ys: 'a list) : ('a list * 'a list) =
91 let fun part ([], answer) = answer
92 | part (x::xs, (ys, ns)) = if p(x)
93 then part (xs, (x::ys, ns))
94 else part (xs, (ys, x::ns))
95 in part (rev ys, ([], [])) end;
102 fun zip ([], []) = []
103 | zip (x::xs,y::ys) = (x,y) :: zip(xs,ys);
105 fun unzip [] = ([],[])
106 | unzip((x,y)::pairs) =
107 let val (xs,ys) = unzip pairs
108 in (x::xs, y::ys) end;
110 fun map f ([], []) = []
111 | map f (x::xs,y::ys) = f(x,y) :: map f (xs,ys);
114 let fun boolf ([], []) = false
115 | boolf (x::xs,y::ys) = p(x,y) orelse boolf (xs,ys)
119 let fun boolf ([], []) = true
120 | boolf (x::xs,y::ys) = p(x,y) andalso boolf (xs,ys)
127 type instream = instream
128 and outstream = outstream
129 exception Io of {name: string, function: string, cause: exn}
133 val openAppend = open_append
134 val openOut = open_out
135 val closeIn = close_in
136 val closeOut = close_out
138 val inputAll = fn is => inputN (is, 999999)
139 val inputLine = input_line
140 val endOfStream = end_of_stream
142 val flushOut = flush_out
146 fun print s = (output (std_out, s); flush_out std_out);