标签: ats

为什么ATS语言从计算机语言基准游戏中删除?

不久前,"ATS"编程语言已从计算机语言基准游戏中删除.您仍然可以通过后机查看旧页面.

为什么ATS编程语言不再包含在计算机语言基准游戏中?

benchmarking dependent-type ats

5
推荐指数
1
解决办法
1439
查看次数

将递归函数变成尾递归

我正在 ATS 中编码,并尝试创建一个函数来查找给定整数的平方根。这里提供的代码可以正确满足我的要求,但不是尾递归。

implement intsqrt(n) = 
if(n >= 1)
  then let
    val n4 = n / 4
    val res = 2 * intsqrt(n4) + 1
  in
    if(res * res <= n) then res else 2*intsqrt(n4)
  end
  else n
Run Code Online (Sandbox Code Playgroud)

我不确定其他人是否熟悉这门语言,但这是我使用它的第一周。我知道常规递归和尾递归之间的明显区别,我只是不明白如何改变它。

我什至不需要确切的代码来做到这一点,我只是想知道这是怎么可能的。为了找到 sqrt,我必须计算 n4 = 1 / n,然后将其乘以 2。然而,这样做会进入递归。我想要做的是计算结果,然后将其传递给下一个递归调用。

这是否意味着我需要以某种方式向后工作?希望这一切都有道理,但如果需要的话我会尽力澄清。

谢谢!

recursion tail-recursion function ats

5
推荐指数
1
解决办法
319
查看次数

如何使用funset_avltree库?

我正在尝试使用该funset_avltree库,但编译器生成无效的 C 代码。我正在使用 ATS/Postiats 版本 0.2.10。

我的代码相当简单:

(* ast.sats *)
staload "libats/SATS/funset_avltree.sats"

datatype ast =
  | ast_var of string

fun free_vars (ast : ast) :<> set string
Run Code Online (Sandbox Code Playgroud)
(* ast.dats *)
#include "share/atspre_staload.hats"
staload "./ast.sats"
staload "libats/SATS/funset_avltree.sats"
dynload "libats/DATS/funset_avltree.dats"

implement free_vars (ast : ast) : set string =
  case+ ast of
  | ast_var name => funset_sing name
Run Code Online (Sandbox Code Playgroud)

然而,编译器的输出相当混乱:

ast_dats.c:359:51:警告:函数“S2EVar”的隐式声明无效
      在 C99 中 [-Wimplicit-function-declaration]
ATSINSmove(tmpret0, PMVtmpltcstmat[0](funset_sing<S2EVar(4713)>)(tmp1)) ;
                                                  ^

ast_dats.c:359:39:错误:使用未声明的标识符“funset_sing”
ATSINSmove(tmpret0, PMVtmpltcstmat[0](funset_sing<S2EVar(4713)>)(tmp1)) ;
                                      ^

ast_dats.c:359:64:错误:预期表达式
ATSINSmove(tmpret0, PMVtmpltcstmat[0](funset_sing<S2EVar(4713)>)(tmp1)) ;
                                                               ^

funset我在和 …

code-generation compiler-errors ats

5
推荐指数
1
解决办法
92
查看次数

涉及 ATS 中的 andalso 宏的类型检查错误

这里有两段代码我认为是等效的,除了第二段的行数比它应该多:

fun
move_ul
{i:nat}
(
  p: int(i) 
, ms: list0(Int)
): list0(Int) =
if p - 5 >= 0 andalso p % 4 != 0 then
  move_ul(p - 5, cons0(p - 5, ms))
else
  ms



fun
move_ul
{i:nat}
(
  p: int(i) 
, ms: list0(Int)
): list0(Int) =
if p % 4 != 0 then
  if p - 5 >= 0 then
    move_ul(p - 5, cons0(p - 5, ms))
  else
    ms
else
  ms
Run Code Online (Sandbox Code Playgroud)

出于某种原因,第二个在类型检查中幸存下来,第一个没有(未能满足约束)......有人能告诉我为什么吗?

ats

5
推荐指数
1
解决办法
71
查看次数

如何在ATS中实现基于尾递归的以下函数?

我有以下递归定义的函数:

fun foo(n: int): int =
  ifcase
    | n = 0 => 0
    | n = 1 => 1
    | n = 2 => 1
    | (* else *) => foo(n-1) + foo(n-3)
  // end of [ifcase]
Run Code Online (Sandbox Code Playgroud)

我怎样才能实现foo基于尾递归的方法.

ats

1
推荐指数
1
解决办法
56
查看次数