Как построить петлю в ATS?

Например, как я могу написать что-то в ATS, соответствующее следующему коду на C:

void myloop(int n)
{
   int i;
   for (i = 0; i < n; i += 1) printf("i = %i\n", i);
   return;
}

ats
person Community    schedule 20.10.2016    source источник


Ответы (3)


Это можно воспроизвести способом, который очень близок к версии 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 нет поддержки строки формата.

person Arets Paeglis    schedule 20.10.2016
comment
Этот прямой подход становится довольно обременительным, если задействованы линейные типы (или действительно что-то помимо простых примеров...), и программисту потребуется много аннотаций, чтобы он работал. Лично мне этот подход нравится больше всего, но, похоже, Хунвэю он не нравится. - person Artyom Shalkhakov; 21.10.2016

Если вам нравятся комбинаторы, попробуйте этот

//
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

person Hongwei Xi    schedule 20.10.2016

Стандартный способ сделать это в функциональном программировании — реализовать функцию хвостовой рекурсии:

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]
person Hongwei Xi    schedule 20.10.2016