120 lines
1.6 KiB
Text
120 lines
1.6 KiB
Text
(* ****** ****** *)
|
|
//
|
|
#include
|
|
"share/atspre_staload.hats"
|
|
#include
|
|
"share/HATS/atspre_staload_libats_ML.hats"
|
|
//
|
|
(* ****** ****** *)
|
|
//
|
|
extern
|
|
fun
|
|
int2digits(x: int): list0(int)
|
|
//
|
|
(* ****** ****** *)
|
|
|
|
implement
|
|
int2digits(x) =
|
|
loop(x, list0_nil) where
|
|
{
|
|
//
|
|
fun
|
|
loop
|
|
(
|
|
x: int, res: list0(int)
|
|
) : list0(int) =
|
|
if x > 0 then loop(x/10, list0_cons(x%10, res)) else res
|
|
//
|
|
} (* end of [int2digits] *)
|
|
|
|
(* ****** ****** *)
|
|
|
|
extern
|
|
fun
|
|
Middle_three_digits(x: int): void
|
|
|
|
(* ****** ****** *)
|
|
|
|
implement
|
|
Middle_three_digits
|
|
(x0) = let
|
|
//
|
|
val x1 =
|
|
(
|
|
if x0 >= 0 then x0 else ~x0
|
|
) : int
|
|
//
|
|
fun
|
|
skip
|
|
(
|
|
ds: list0(int), k: int
|
|
) : list0(int) =
|
|
if k > 0 then skip(ds.tail(), k-1) else ds
|
|
//
|
|
val ds =
|
|
int2digits(x1)
|
|
//
|
|
val n0 = length(ds)
|
|
//
|
|
in
|
|
//
|
|
if
|
|
(n0 <= 2)
|
|
then
|
|
(
|
|
println! ("Middle-three-digits(", x0, "): Too small!")
|
|
)
|
|
else
|
|
(
|
|
if
|
|
(n0 % 2 = 0)
|
|
then
|
|
(
|
|
println!
|
|
(
|
|
"Middle-three-digits(", x0, "): Even number of digits!"
|
|
)
|
|
)
|
|
else let
|
|
val ds =
|
|
skip(ds, (n0-3)/2)
|
|
val-list0_cons(d1, ds) = ds
|
|
val-list0_cons(d2, ds) = ds
|
|
val-list0_cons(d3, ds) = ds
|
|
in
|
|
println! ("Middle-three-digits(", x0, "): ", d1, d2, d3)
|
|
end // end of [else]
|
|
)
|
|
//
|
|
end // end of [Middle_three_digits]
|
|
|
|
(* ****** ****** *)
|
|
|
|
implement
|
|
main0() =
|
|
{
|
|
//
|
|
val
|
|
thePassing =
|
|
g0ofg1
|
|
(
|
|
$list{int}
|
|
(
|
|
123
|
|
, 12345
|
|
, 1234567
|
|
, 987654321
|
|
, 10001, ~10001
|
|
, ~123, ~100, 100, ~12345
|
|
)
|
|
)
|
|
val
|
|
theFailing =
|
|
g0ofg1($list{int}(1, 2, ~1, ~10, 2002, ~2002, 0))
|
|
//
|
|
val () = thePassing.foreach()(lam x => Middle_three_digits(x))
|
|
val () = theFailing.foreach()(lam x => Middle_three_digits(x))
|
|
//
|
|
} (* end of [main0] *)
|
|
|
|
(* ****** ****** *)
|