我正在尝试使用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: 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)) ; ^
我在funset
和funset_listord
时遇到了类似的错误。我必须遗漏一些微不足道的东西。我是否需要包含某些内容或将一些标志传递给编译器?
答案 0 :(得分:3)
根本原因是您没有静态加载库提供的AVL树模板。
在错误消息中,PMVtmpltcstmat
通常表示模板出现问题。程序员通常会忘记包含模板,或者忘记提供模板变量。你是第一个案子。
请添加此行,
staload _ = "libats/DATS/funset_avltree.dats"
静态加载模板,并使它们可供编译器使用。请参阅此处的工作示例https://glot.io/snippets/eiu6f3dd2r
此外,当您拥有需要评估的“全局”值时,需要dynload
。在您的情况下,您不需要dynload
avl树库。此外,在您自己的文件ast.dats
中,没有这样的全局值。你可以定义
#define ATS_DYNLOADFLAG 0
告诉编译器不要为ast.dats
生成动态加载代码。
答案 1 :(得分:0)