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