File: int-inf.2.sml

package info (click to toggle)
mlton 20210117%2Bdfsg-3
  • links: PTS, VCS
  • area: main
  • in suites: sid
  • size: 58,464 kB
  • sloc: ansic: 27,682; sh: 4,455; asm: 3,569; lisp: 2,879; makefile: 2,347; perl: 1,169; python: 191; pascal: 68; javascript: 7
file content (41 lines) | stat: -rw-r--r-- 1,454 bytes parent folder | download | duplicates (7)
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
val big: IntInf.int = 0x80000000

fun try (barg: IntInf.int): unit =
       let
          val small = SOME (IntInf.toInt barg)
                  handle Overflow => NONE
           val bstr = IntInf.toString barg
           val _ = print (concat ["trying ", bstr, "\n"])
           fun fail msg = print ("Fail " ^ msg ^ ": " ^ bstr ^ "\n")
           val isSmall = ~ big <= barg andalso barg < big
       in case small of
             NONE => if isSmall
                        then fail "1"
                        else ()
             | SOME sarg => if isSmall
                               then let val sstr = Int.toString sarg
                                    in if bstr = sstr
                                       andalso barg = IntInf.fromInt sarg
                                          then ()
                                          else fail "2"
                                    end
                               else fail "3"
       end

fun spin (low: IntInf.int, limit: IntInf.int): unit =
       let fun loop (arg: IntInf.int): unit =
                  if arg = limit
                     then ()
                     else (
                        try arg;
                        try (~ arg);
                        loop (arg + 1)
                     )
       in loop low
       end

val _ = spin (0, 1000)
val _ = spin (0x40000000 - 1000, 0x40000000 + 1000)
val _ = spin (big - 1000, big + 1000)

val _ = print "All ok\n"