5

我正在尝试使用该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
(* 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

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

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)) ;
                                                               ^

我得到类似的错误funsetfunset_listord。我一定错过了一些微不足道的东西。我需要包含一些东西或将一些标志传递给编译器吗?

4

2 回答 2

3

根本原因是您没有静态加载库提供的 AVL 树模板。

在错误消息中,PMVtmpltcstmat通常表明模板有问题。通常情况下,程序员忘记包含模板,或者忘记提供模板变量。你是第一个案例。

请添加此行,

staload _ = "libats/DATS/funset_avltree.dats"

静态加载模板,并使它们可供编译器使用。在这里查看一个工作示例,https://glot.io/snippets/eiu6f3dd2r


此外,dynload当您有需要评估的“全局”值时需要。在您的情况下,您不需要dynloadavl 树库。此外,在您自己的文件ast.dats中,没有这样的全局值。你可以定义

#define ATS_DYNLOADFLAG 0

告诉编译器不要为ast.dats.

于 2016-09-27T13:53:39.963 回答
0

这是 ATSLIB 中的一个示例:

https://github.com/githwxi/ATS-Postiats/blob/master/libats/ML/HATS/myfunset.hats

下面的书中有一章是关于功能集和映射的:

http://ats-lang.sourceforge.net/DOCUMENT/ATS2TUTORIAL/HTML/HTMLTOC/book1.html

目前是第 12 章:

http://ats-lang.sourceforge.net/DOCUMENT/ATS2TUTORIAL/HTML/HTMLTOC/c514.html

于 2016-10-17T13:02:55.707 回答