Например, как я могу написать что-то в ATS, соответствующее следующему коду на C:
void myloop(int n)
{
int i;
for (i = 0; i < n; i += 1) printf("i = %i\n", i);
return;
}
Например, как я могу написать что-то в ATS, соответствующее следующему коду на C:
void myloop(int n)
{
int i;
for (i = 0; i < n; i += 1) printf("i = %i\n", i);
return;
}
Это можно воспроизвести способом, который очень близок к версии C:
fun myloop (n: int): void = let
var i: int
in
for (i := 0; i < n; i := i + 1) begin
println! ("i = ", i)
end
end
Небольшое предостережение: насколько мне известно, в print
и println
нет поддержки строки формата.
Если вам нравятся комбинаторы, попробуйте этот
//
staload "share/atspre_staload.hats"
staload "share/HATS/atspre_staload_libats_ML.hats"
//
fun myloop(n: int): void =
(n).foreach()(lam i => $extfcall(void, "printf", "i = %i\n", i))
//
При компиляции кода нужен флаг -DATS_MEMALLOC_LIBC. Вы можете попробовать код здесь:
https://glot.io/snippets/ejjr3j1pil
Стандартный способ сделать это в функциональном программировании — реализовать функцию хвостовой рекурсии:
fun myloop
(n: int): void = let
fun myloop2
(n: int, i: int): void =
if i < n then (println! ("i = ", i); myloop2(n, i+1)) else ()
// end of [myloop2]
in
myloop2(n, 0)
end // end of [myloop]