109 lines
2.7 KiB
Common Lisp
109 lines
2.7 KiB
Common Lisp
(*
|
|
The class A2I provides integer-to-string and string-to-integer
|
|
conversion routines. To use these routines, either inherit them
|
|
in the class where needed, have a dummy variable bound to
|
|
something of type A2I, or simpl write (new A2I).method(argument).
|
|
*)
|
|
|
|
|
|
(*
|
|
c2i Converts a 1-character string to an integer. Aborts
|
|
if the string is not "0" through "9"
|
|
*)
|
|
class A2I {
|
|
|
|
c2i(char : String) : Int {
|
|
if char = "0" then 0 else
|
|
if char = "1" then 1 else
|
|
if char = "2" then 2 else
|
|
if char = "3" then 3 else
|
|
if char = "4" then 4 else
|
|
if char = "5" then 5 else
|
|
if char = "6" then 6 else
|
|
if char = "7" then 7 else
|
|
if char = "8" then 8 else
|
|
if char = "9" then 9 else
|
|
{ abort(); 0; } -- the 0 is needed to satisfy the typchecker
|
|
fi fi fi fi fi fi fi fi fi fi
|
|
};
|
|
|
|
(*
|
|
i2c is the inverse of c2i.
|
|
*)
|
|
i2c(i : Int) : String {
|
|
if i = 0 then "0" else
|
|
if i = 1 then "1" else
|
|
if i = 2 then "2" else
|
|
if i = 3 then "3" else
|
|
if i = 4 then "4" else
|
|
if i = 5 then "5" else
|
|
if i = 6 then "6" else
|
|
if i = 7 then "7" else
|
|
if i = 8 then "8" else
|
|
if i = 9 then "9" else
|
|
{ abort(); ""; } -- the "" is needed to satisfy the typchecker
|
|
fi fi fi fi fi fi fi fi fi fi
|
|
};
|
|
|
|
(*
|
|
a2i converts an ASCII string into an integer. The empty string
|
|
is converted to 0. Signed and unsigned strings are handled. The
|
|
method aborts if the string does not represent an integer. Very
|
|
long strings of digits produce strange answers because of arithmetic
|
|
overflow.
|
|
|
|
*)
|
|
a2i(s : String) : Int {
|
|
if s.length() = 0 then 0 else
|
|
if s.substr(0,1) = "-" then ~a2i_aux(s.substr(1,s.length()-1)) else
|
|
if s.substr(0,1) = "+" then a2i_aux(s.substr(1,s.length()-1)) else
|
|
a2i_aux(s)
|
|
fi fi fi
|
|
};
|
|
|
|
(*
|
|
a2i_aux converts the usigned portion of the string. As a programming
|
|
example, this method is written iteratively.
|
|
*)
|
|
a2i_aux(s : String) : Int {
|
|
(let int : Int <- 0 in
|
|
{
|
|
(let j : Int <- s.length() in
|
|
(let i : Int <- 0 in
|
|
while i < j loop
|
|
{
|
|
int <- int * 10 + c2i(s.substr(i,1));
|
|
i <- i + 1;
|
|
}
|
|
pool
|
|
)
|
|
);
|
|
int;
|
|
}
|
|
)
|
|
};
|
|
|
|
(*
|
|
i2a converts an integer to a string. Positive and negative
|
|
numbers are handled correctly.
|
|
*)
|
|
i2a(i : Int) : String {
|
|
if i = 0 then "0" else
|
|
if 0 < i then i2a_aux(i) else
|
|
"-".concat(i2a_aux(i * ~1))
|
|
fi fi
|
|
};
|
|
|
|
(*
|
|
i2a_aux is an example using recursion.
|
|
*)
|
|
i2a_aux(i : Int) : String {
|
|
if i = 0 then "" else
|
|
(let next : Int <- i / 10 in
|
|
i2a_aux(next).concat(i2c(i - next * 10))
|
|
)
|
|
fi
|
|
};
|
|
|
|
};
|