不久前,"ATS"编程语言已从计算机语言基准游戏中删除.您仍然可以通过后机查看旧页面.
为什么ATS编程语言不再包含在计算机语言基准游戏中?
我正在 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。然而,这样做会进入递归。我想要做的是计算结果,然后将其传递给下一个递归调用。
这是否意味着我需要以某种方式向后工作?希望这一切都有道理,但如果需要的话我会尽力澄清。
谢谢!
我正在尝试使用该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
我在和 …
这里有两段代码我认为是等效的,除了第二段的行数比它应该多:
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)
出于某种原因,第二个在类型检查中幸存下来,第一个没有(未能满足约束)......有人能告诉我为什么吗?
我有以下递归定义的函数:
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
基于尾递归的方法.