Compiler errors 如何使用funset_avltree库?

Compiler errors 如何使用funset_avltree库?,compiler-errors,code-generation,ats,Compiler Errors,Code Generation,Ats,我试图使用funset\u 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.c:359:51:

我试图使用
funset\u 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.c:359:51: warning: implicit declaration of function 'S2EVar' is invalid in C99 [-Wimplicit-function-declaration] ATSINSmove(tmpret0, PMVtmpltcstmat[0](funset_sing<S2EVar(4713)>)(tmp1)) ; ^ ast_dats.c:359:39: error: use of undeclared identifier 'funset_sing' ATSINSmove(tmpret0, PMVtmpltcstmat[0](funset_sing<S2EVar(4713)>)(tmp1)) ; ^ ast_dats.c:359:64: error: expected expression ATSINSmove(tmpret0, PMVtmpltcstmat[0](funset_sing<S2EVar(4713)>)(tmp1)) ; ^ ast_dats.c:359:51:警告:函数“S2EVar”的隐式声明无效 在C99中[-Wimplicit函数声明] ATSINSmove(tmpret0,PMVtmpltcstmat[0](funset_sing)(tmp1)); ^ ast_dats.c:359:39:错误:使用未声明的标识符“funset_sing” ATSINSmove(tmpret0,PMVtmpltcstmat[0](funset_sing)(tmp1)); ^ ast_dats.c:359:64:错误:应为表达式 ATSINSmove(tmpret0,PMVtmpltcstmat[0](funset_sing)(tmp1)); ^
我在
funset
funset\u listord
中遇到了类似的错误。我一定错过了一些琐碎的事情。我是否需要包含一些内容或向编译器传递一些标志?

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

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

请加上这一行

staload _ = "libats/DATS/funset_avltree.dats"
静态加载模板,并使其可供编译器使用。这里有一个工作示例


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

#define ATS_DYNLOADFLAG 0

告诉编译器不要为
ast.dats
生成动态加载代码

以下是ATSLIB中的一个示例:

下面有一章介绍函数集和映射 书籍:

目前是第12章:


你好,谢谢。我不知道你必须用模板定义加载dats文件。我在《ATS编程入门》一书中找不到这个。不客气。模板系统是相当新的。我想作者还在完成相关章节。@rightfold,我访问了你的网站。您保存了一份关于ATS的文档,这真是太好了。我只想提请大家注意,这是官方的,计划包括越来越多的用户贡献的文档。非常欢迎你的贡献。谢谢
#define ATS_DYNLOADFLAG 0