1

例如,我如何在 ATS 中编写与以下 C 代码相对应的内容:

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

3 回答 3

1

可以用一种非常接近 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

一个小警告:据我所知,printand中没有格式字符串支持println

于 2016-10-20T16:41:32.120 回答
1

如果你喜欢组合器,试试这个

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

于 2016-10-20T18:11:32.717 回答
0

在函数式编程中执行此操作的标准方法是实现尾递归函数:

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]
于 2016-10-20T18:17:19.063 回答