2016-09-26 2 views
3

Я пытаюсь использовать библиотеку funset_avltree, но компилятор генерирует недопустимый код C. Я использую версию ATS/Postiats 0.2.10.Как использовать библиотеку funset_avltree?

Мой код довольно прост:

(* 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. Я должен упустить что-то тривиальное. Должен ли я включать что-то или передавать некоторый флаг компилятору?

ответ

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.

+0

Привет, спасибо. Я не знал, что вам нужно ставить файлы dats с определениями шаблонов. Я не мог найти это в книге «Введение в программирование в ОВД». – rightfold

+0

Добро пожаловать. Система шаблонов довольно новая. Я думаю, что автор все еще заканчивает соответствующие главы. –

+1

@ rightfold, я посетил ваш сайт. Очень приятно, что вы храните документацию об ATS. Я просто хочу обратить ваше внимание на то, что http://discourse.ats-lang.org/c/documentation является официальным, и в него планируется включить все больше и больше пользовательских документов. И ваш вклад очень приветствуется. Благодарю. –