| 1 | val big: IntInf.int = 0x80000000 |
| 2 | |
| 3 | fun try (barg: IntInf.int): unit = |
| 4 | let val small = SOME (IntInf.toInt barg) |
| 5 | handle Overflow => NONE |
| 6 | val bstr = IntInf.toString barg |
| 7 | fun fail msg = print ("Fail " ^ msg ^ ": " ^ bstr ^ "\n") |
| 8 | val isSmall = ~ big <= barg andalso barg < big |
| 9 | in case small of |
| 10 | NONE => if isSmall |
| 11 | then fail "1" |
| 12 | else () |
| 13 | | SOME sarg => if isSmall |
| 14 | then let val sstr = Int.toString sarg |
| 15 | in if bstr = sstr |
| 16 | andalso barg = IntInf.fromInt sarg |
| 17 | then () |
| 18 | else fail "2" |
| 19 | end |
| 20 | else fail "3" |
| 21 | end |
| 22 | |
| 23 | fun spin (low: IntInf.int, limit: IntInf.int): unit = |
| 24 | let fun loop (arg: IntInf.int): unit = |
| 25 | if arg = limit |
| 26 | then () |
| 27 | else ( |
| 28 | try arg; |
| 29 | try (~ arg); |
| 30 | loop (arg + 1) |
| 31 | ) |
| 32 | in loop low |
| 33 | end |
| 34 | |
| 35 | val _ = spin (0, 1000) |
| 36 | val _ = spin (big - 1000, big + 1000) |
| 37 | |
| 38 | val _ = print "All ok\n" |