1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67
|
(*
Title: Rebuild the basis library: integer
Copyright David C.J. Matthews 2016
This library is free software; you can redistribute it and/or
modify it under the terms of the GNU Lesser General Public
License version 2.1 as published by the Free Software Foundation.
This library is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
Lesser General Public License for more details.
You should have received a copy of the GNU Lesser General Public
License along with this library; if not, write to the Free Software
Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
*)
type int = IntInf.int;
(* Integer *)
(* Define this first. It's explicitly referenced in the INTEGER signature. *)
structure Int = struct type int = IntInf.int end;
(* This uses Int.int so needs to be rebuilt. *)
useBasis "INTEGER";
signature INT_INF =
sig
include INTEGER
val divMod : int * int -> int * int
val quotRem : int * int -> int * int
val pow : int * Int.int -> int
val log2 : int -> Int.int
val orb : int * int -> int
val xorb : int * int -> int
val andb : int * int -> int
val notb : int -> int
val << : int * Word.word -> int
val ~>> : int * Word.word -> int
end;
structure IntInf: INT_INF =
struct
open IntInf
val toInt = toLarge and fromInt = fromLarge
val precision = Option.map FixedInt.toLarge precision
val sign = FixedInt.toLarge o sign
val log2 = FixedInt.toLarge o log2
val pow = fn (i, j) => pow(i, FixedInt.fromLarge j)
end;
structure LargeInt: INTEGER = IntInf;
structure Int: INTEGER = LargeInt;
structure FixedInt: INTEGER =
struct
open FixedInt
val toInt = toLarge and fromInt = fromLarge
val precision = Option.map toLarge precision
val sign = FixedInt.toLarge o sign
end;
val () =
case FixedInt.precision of SOME 31 => useBasis "Int31.sml" | SOME 63 => useBasis "Int63.sml" | _ => ();
|