【问题标题】:Mozart Programming: Integer to Hexadecimal conversion in OZ莫扎特编程:OZ 中的整数到十六进制转换
【发布时间】:2022-08-04 11:15:09
【问题描述】:
我正在学习莫扎特,我有一个问题,有没有人知道如何在没有手动数学表转换的情况下将整数转换为十六进制。是否有任何包含的功能/模块可以做到这一点?我知道如何转换另一种方式:
{String.toInt \"0x2d7\"} %% Hex to Int
{String.toInt \"052\"} %% Octal to Int
{String.toInt \"0b101010\"} %% Binary to Int
先感谢您。
标签:
type-conversion
oz
mozart
【解决方案1】:
我认为该语言没有任何类似函数或模块可以从十进制转换为十六进制。无论如何,这是一个可能的解决方案。它可能不是很高效或优雅,但您可以看到该语言处理的一些基本思想。
declare
proc {DecConv X F ?R} % X:integer; F: b:binary, o:octal, or x:hexa; R:Result.
fun {DivList N F}
if N =< 0 then nil
else N mod F|{DivList (N div F) F}
end
end Rs in
if {Int.is X} then
case F
of b then Dl={List.reverse {DivList X 2}} in
Rs={Append "0b" {FoldR Dl fun {$ X Xr}
if X==0 then 48|Xr else 49|Xr end
end nil}}
[] o then Dl={List.reverse {DivList X 8}} in
Rs={Append "0" {FoldR Dl fun {$ X Xr} {Int.toString X}.1|Xr end nil}}
[] x then Dl={List.reverse {DivList X 16}} in
Rs={Append "0x" {FoldR Dl fun {$ X Xr}
if X==10 then &A|Xr
elseif X==11 then &B|Xr
elseif X==12 then &C|Xr
elseif X==13 then &D|Xr
elseif X==14 then &E|Xr
elseif X==15 then &F|Xr
else {Int.toString X}.1|Xr
end
end nil}}
else raise error_Enter_Format(F) end
end
else raise error_Should_be_Int(X) end
end
R={String.toAtom Rs}
end
尝试在Mozart 中运行此代码,方法是选择它,然后按住 Ctrl 键,然后按点键,然后按 R 键(输入区域)。在此之后,您可以使用Ctrl . Ctrl L 提供任何下一行(到馈线):
{Browse {DecConv 123 b}} %% '0b1111011'
{Browse {DecConv 123 o}} %% '0173'
{Browse {DecConv 123 x}} %% '0x7B'
如您所见,答案是原子。您还可以使用函数{Atom.toString +A ?S} 将原子A 转换为字符串S。我希望这对您有用。