#ats
#ats
Вопрос:
В следующем коде:
#include "share/atspre_staload.hats"
extern castfn usize_of_int(num: int): size_t
extern castfn usize_of_int_n{n:int}(num: int(n)): size_t(n)
overload _usize with usize_of_int
overload _usize1 with usize_of_int_n
postfix _usize
postfix _usize1
dataview array_view(a:viewt@ype , addr, int) =
| {l:addr} array_nil(a, l, 0)
| {l:addr}{n:nat} array_cons(a, l, n 1) of (a@l, array_view(a, l sizeof(a), n))
datavtype Vec(a:viewt@ype , n:int) =
{c:nat} Vector of (size_t(c), [l:addr] (array_view(a, l, c) | ptr l), size_t(n))
extern fun calloc {a:t@ype}{n:nat} (num: size_t(n), tsz: size_t(sizeof(a))) : [l:addr] (array_view(a, l, n) | ptr l) = "ext#"
extern fun {a:t@ype} free {l:addr}(a@l | ptr l): void = "ext#"
extern prfun {a:t@ype} consume{n:nat}{l:addr}(array_view(a, l, n)): void
fun {a:t@ype} allocate_array {n:nat}(num: size_t(n)): [l:addr] (array_view(a, l, n) | ptr l) =
calloc{a}(num, sizeof<a>)
fun {a:t@ype} free_array{l:addr}{n:int | n > 0}(array_view: array_view(a, l, n) | ptr: ptr l): void =
let prval array_cons(element_proof, _) = array_view
in
free(element_proof | ptr)
end
fun {a:t@ype} new_vector(): Vec(a, 0) =
let val capacity = 10_usize1
val (array_view | elements) = allocate_array<a>(capacity)
in
Vector(capacity, (array_view | elements), 0_usize1)
end
fun {a:t@ype} vector_free(vec: [n:int] Vec(a, n)): void =
let val ~Vector(capacity, (array_view | elements), _) = vec
in
if capacity > (0_usize1) then
free_array(array_view | elements)
else
consume(array_view)
end
overload .free with vector_free
implement main0() = {
val vector = new_vector<int>()
val () = vector.free()
}
Я получаю много ошибок от gcc:
In file included from build/release/src/main_dats.o.c:15:
build/release/src/main_dats.o.c: Dans la fonction « vector_free_3__3__1 »:
build/release/src/main_dats.o.c:795:29: error: « PMVtmpltcstmat » non déclaré (première utilisation dans cette fonction)
ATSINSmove_void(tmpret4__1, PMVtmpltcstmat[0](consume<S2EVar(5259)>)()) ;
^~~~~~~~~~~~~~
/usr/lib/ats2-postiats-0.3.11/ccomp/runtime/pats_ccomp_instrset.h:284:39: note: dans la définition de la macro « ATSINSmove_void »
#define ATSINSmove_void(tmp, command) command
^~~~~~~
build/release/src/main_dats.o.c:795:29: note: chaque identificateur non déclaré est rapporté une seule fois pour chaque fonction dans laquelle il apparaît
ATSINSmove_void(tmpret4__1, PMVtmpltcstmat[0](consume<S2EVar(5259)>)()) ;
^~~~~~~~~~~~~~
/usr/lib/ats2-postiats-0.3.11/ccomp/runtime/pats_ccomp_instrset.h:284:39: note: dans la définition de la macro « ATSINSmove_void »
#define ATSINSmove_void(tmp, command) command
^~~~~~~
build/release/src/main_dats.o.c:795:47: error: « consume » non déclaré (première utilisation dans cette fonction)
ATSINSmove_void(tmpret4__1, PMVtmpltcstmat[0](consume<S2EVar(5259)>)()) ;
^~~~~~~
/usr/lib/ats2-postiats-0.3.11/ccomp/runtime/pats_ccomp_instrset.h:284:39: note: dans la définition de la macro « ATSINSmove_void »
#define ATSINSmove_void(tmp, command) command
^~~~~~~
build/release/src/main_dats.o.c:795:55: warning: déclaration implicite de la fonction « S2EVar » [-Wimplicit-function-declaration]
ATSINSmove_void(tmpret4__1, PMVtmpltcstmat[0](consume<S2EVar(5259)>)()) ;
^~~~~~
/usr/lib/ats2-postiats-0.3.11/ccomp/runtime/pats_ccomp_instrset.h:284:39: note: dans la définition de la macro « ATSINSmove_void »
#define ATSINSmove_void(tmp, command) command
^~~~~~~
build/release/src/main_dats.o.c:795:68: error: expected expression before « ) » token
ATSINSmove_void(tmpret4__1, PMVtmpltcstmat[0](consume<S2EVar(5259)>)()) ;
^
/usr/lib/ats2-postiats-0.3.11/ccomp/runtime/pats_ccomp_instrset.h:284:39: note: dans la définition de la macro « ATSINSmove_void »
#define ATSINSmove_void(tmp, command) command
^~~~~~~
build/release/src/main_dats.o.c: Dans la fonction « free_array_1__1__1 »:
build/release/src/main_dats.o.c:832:29: error: « PMVtmpltcstmat » non déclaré (première utilisation dans cette fonction)
ATSINSmove_void(tmpret1__1, PMVtmpltcstmat[0](free<S2EVar(5259)>)(arg0)) ;
^~~~~~~~~~~~~~
/usr/lib/ats2-postiats-0.3.11/ccomp/runtime/pats_ccomp_instrset.h:284:39: note: dans la définition de la macro « ATSINSmove_void »
#define ATSINSmove_void(tmp, command) command
^~~~~~~
build/release/src/main_dats.o.c:832:51: warning: comparaison entre un pointeur et un entier
ATSINSmove_void(tmpret1__1, PMVtmpltcstmat[0](free<S2EVar(5259)>)(arg0)) ;
^
/usr/lib/ats2-postiats-0.3.11/ccomp/runtime/pats_ccomp_instrset.h:284:39: note: dans la définition de la macro « ATSINSmove_void »
#define ATSINSmove_void(tmp, command) command
^~~~~~~
build/release/src/main_dats.o.c:832:65: error: expected expression before « ) » token
ATSINSmove_void(tmpret1__1, PMVtmpltcstmat[0](free<S2EVar(5259)>)(arg0)) ;
^
/usr/lib/ats2-postiats-0.3.11/ccomp/runtime/pats_ccomp_instrset.h:284:39: note: dans la définition de la macro « ATSINSmove_void »
#define ATSINSmove_void(tmp, command) command
^~~~~~~
Я не уверен, что не так, так как я могу исправить эти ошибки?
Кроме того, комментируемый код также не компилируется, поэтому я бы тоже хотел найти решение для этого.
Ответ №1:
‘calloc’ должен быть полиморфной функцией (вместо шаблона функции):
extern
fun
calloc
{a:t@ype}{n:nat}
(
num: size_t(n), tsz: size_t(sizeof(a))
) : [l:addr] (array_view(a, l, n) | ptr l) = "ext#"
Кроме того, ‘Vec’ должен быть определен как ‘datavtype’. Пожалуйста, посмотрите
следующий пример, который должен быть полезным:
http://ats-lang.sourceforge.net/EXAMPLE/EFFECTIVATS/queue-sllist2/main.html
Комментарии:
1. Я пробовал с этими изменениями, но это все еще не работает. Я обновил код и ошибки в вопросе с этими изменениями.
2. Ты забыл:
#include "share/atspre_staload.hats"
3. Я все еще получаю много ошибок при включении. Я обновил код и ошибки в вопросе с этим изменением.
4. ‘consume’ — это функция проверки; так что сделайте { prval () = consume(…) } . Также ‘free’ должна быть полиморфной функцией (вместо шаблона функции).
5. Я бы посоветовал вам размещать такие вопросы в группе Google для ats-lang.