Here are the files, with some of the functions that are never used in the
example removed.
The code was compiled with: *patscc -c -DATS_MEMALLOC_LIBC dict.dats*
| | |
(*
### dict.sats ###
*)
#include "share/atspre_staload.hats"
(* buckets (aka linked lists) *)
absvtype bucket (a:vt@ype) = ptr
fn{a:vt@ype} bucket_new ( string, a ) : bucket(a)
fn{a:vt@ype} bucket_map ( !bucket(a) ) : void
fn{a:vt@ype} bucket_filter_map ( b: !bucket(a) ) : void
fn{a:vt@ype} bucket_item$delete ( x: a ): void
fn{a:vt@ype} bucket_item$map ( x: &a ): void
fn{a:vt@ype} bucket_item$filter ( x: !a ): bool
fn{a:vt@ype} bucket_item$to_string ( x: !a ): string
fun{a:vt@ype} bucket_delete_recursive ( b: bucket(a) ) : void
fn{a:vt@ype} bucket_print ( b: !bucket(a) ) : void
(* dictionaries *)
sortdef dsz = {s:int | s > 0}
absvt@ype dict (a:vt@ype, n:int) = @{size=int,buckets=ptr}
fn{a:vt@ype} dict_new {s:dsz} ( int s ) : dict(a, s)
fn{a:t@ype} dict_delete {s:dsz} ( d: dict(a, s) ) : void
fn{a:vt@ype} dict_delete_lin {s:dsz} ( d: dict(a, s) ) : void
fn{a:vt@ype} dict_delete_fun {s:dsz} ( d: dict(a, s), (a) -> void ) : void
| | |
(*
### dict.dats ###
*)
#include "share/atspre_staload.hats"
staload "./dict.sats"
fn hash {n:int | n>0}{s:int | s>0}
( s: string(s), size: int(n) ) : [o:int | o >= 0; o < n] int o = let
fun hash_num {i:nat | i <= s}
( i: int i, h: int, str_sz: int(s) ) : int =
if i < str_sz then let
val c_at_i = string_get_at_gint(s, i)
in
hash_num(i+1, h * 101 + g0int_of_char(c_at_i),
str_sz)
end else h
in
g1int_nmod(abs(g1ofg0(hash_num(0, 0, sz2i(strlen(s))))), size)
end
local
datavtype BUCKET (a:vt@ype) =
| bucket_empty of ()
| bucket_filled of (Strptr1, a, BUCKET(a))
assume bucket(a:vt@ype) = BUCKET(a)
assume dict(a:vt@ype, n:int) = @{
size=int n,
buckets=arrayptr(bucket(a), n)
}
extern fn{a:vt@ype} bucket_operate ( !bucket(a) ) : void
in
implement{a} dict_new {s} ( size ) = let
val size_st = size_of_int(size)
val bucket_arr = arrayptr_make_uninitized<bucket(a)>(size_st)
implmnt array_initize$init<bucket(a)> (i, x) = x := bucket_empty()
val () = arrayptr_initize<bucket(a)>(bucket_arr, size_st)
in
@{size=size, buckets=bucket_arr}:dict(a, s)
end
implmnt{a} dict_delete ( d ) = let
implmnt(a2:t@ype) bucket_item$delete<a2> ( x ) = ()
in
dict_delete_lin<a>(d)
end
implmnt{a} bucket_delete_recursive ( b ) =
case+ b of
| ~bucket_empty() => ()
| ~bucket_filled(str, x, next_bucket) => let
val () = strptr_free(str)
val () = bucket_item$delete<a>(x)
in
bucket_delete_recursive<a>(next_bucket)
end
implmnt{a} dict_delete_lin ( d ) = let
implmnt array_uninitize$clear<bucket(a)> (i, x) =
bucket_delete_recursive<a>(x)
in
arrayptr_freelin(d.buckets, size_of_int(d.size))
end
implmnt{a} dict_delete_fun ( d, dltr ) = let
implmnt bucket_item$delete<a> ( x ) = dltr(x)
in
dict_delete_lin(d)
end
implmnt{a} bucket_new ( key, item ) =
bucket_filled($UNSAFE.castvwtp0{Strptr1}(key), item, bucket_empty())
implmnt{a} bucket_map ( b ) =
case+ b of
| bucket_empty() => ()
| @bucket_filled(_, x, next_bucket) => {
val () = bucket_item$map(x)
val () = bucket_map(next_bucket)
prval () = fold@(b)
}
implmnt{a} bucket_filter_map ( b ) =
case+ b of
| bucket_empty() => ()
| @bucket_filled(_, x, next_bucket) =>
if bucket_item$filter(x) then {
val () = bucket_item$map(x)
val () = bucket_filter_map(next_bucket)
prval () = fold@(b)
}
else {
val () = bucket_filter_map(next_bucket)
prval () = fold@(b)
}
implmnt{a} bucket_print ( b ) =
case+ b of
| bucket_empty() => ()
| bucket_filled(str, x, next_bucket) => let
val () = print("\(")
val () = print(str)
val () = print(" : ")
val () = print( bucket_item$to_string(x) )
val () = print(")")
in
bucket_print(next_bucket)
end
end
var d = dict_new<int>(7)
val () = dict_delete<int>(d)
| | |
On Thursday, December 30, 2021 at 2:48:29 PM UTC-5 gmhwxi wrote:
> Where can I find your source code so that I can produce the error you are
> referring to?
>
> --Hongwei
>
>
> On Thu, Dec 30, 2021 at 12:47 PM d4v3y_5c0n3s <[email protected]> wrote:
>
>> Ok, so I've been able to get the "dict" type to be abstract, but I can't
>> seem to get "bucket" to be abstract. I tried adding the "= ptr" part you
>> suggested, but I'm not having any luck. Using your solution, the code will
>> compile, unless I test the "dict" type by calling "dict_new" &
>> "dict_delete." Looking at the error messages, the problem appears to be
>> related to the "dict_delete" call, and I've provided the error below so you
>> can see for yourself. I know that there are a lot of details missing, so
>> let me know if you'd like me to provide any more details.
>>
>> Error message:
>> In file included from dict_dats.c:15:
>> dict_dats.c: In function ‘loop_95__95__1’:
>> dict_dats.c:6190:28: error: ‘PMVtmpltcstmat’ undeclared (first use in
>> this function)
>> 6190 | ATSINSmove_void(tmp195__1,
>> PMVtmpltcstmat[0](array_uninitize$clear<S2Eapp(S2Ecst(BUCKET);
>> S2Eapp(S2Ecst(g0int_t0ype); S2Eextkind(atstype_int)))>)(arg2,
>> ATSPMVrefarg1(arg0))) ;
>> | ^~~~~~~~~~~~~~
>> /usr/local/lib/ats2-postiats-0.4.2/ccomp/runtime/pats_ccomp_instrset.h:284:39:
>>
>> note: in definition of macro ‘ATSINSmove_void’
>> 284 | #define ATSINSmove_void(tmp, command) command
>> | ^~~~~~~
>> dict_dats.c:6190:28: note: each undeclared identifier is reported only
>> once for each function it appears in
>> 6190 | ATSINSmove_void(tmp195__1,
>> PMVtmpltcstmat[0](array_uninitize$clear<S2Eapp(S2Ecst(BUCKET);
>> S2Eapp(S2Ecst(g0int_t0ype); S2Eextkind(atstype_int)))>)(arg2,
>> ATSPMVrefarg1(arg0))) ;
>> | ^~~~~~~~~~~~~~
>> /usr/local/lib/ats2-postiats-0.4.2/ccomp/runtime/pats_ccomp_instrset.h:284:39:
>>
>> note: in definition of macro ‘ATSINSmove_void’
>> 284 | #define ATSINSmove_void(tmp, command) command
>> | ^~~~~~~
>> dict_dats.c:6190:46: error: ‘array_uninitize$clear’ undeclared (first use
>> in this function)
>> 6190 | ATSINSmove_void(tmp195__1,
>> PMVtmpltcstmat[0](array_uninitize$clear<S2Eapp(S2Ecst(BUCKET);
>> S2Eapp(S2Ecst(g0int_t0ype); S2Eextkind(atstype_int)))>)(arg2,
>> ATSPMVrefarg1(arg0))) ;
>> | ^~~~~~~~~~~~~~~~~~~~~
>> /usr/local/lib/ats2-postiats-0.4.2/ccomp/runtime/pats_ccomp_instrset.h:284:39:
>>
>> note: in definition of macro ‘ATSINSmove_void’
>> 284 | #define ATSINSmove_void(tmp, command) command
>> | ^~~~~~~
>> dict_dats.c:6190:68: warning: implicit declaration of function ‘S2Eapp’
>> [-Wimplicit-function-declaration]
>> 6190 | ATSINSmove_void(tmp195__1,
>> PMVtmpltcstmat[0](array_uninitize$clear<S2Eapp(S2Ecst(BUCKET);
>> S2Eapp(S2Ecst(g0int_t0ype); S2Eextkind(atstype_int)))>)(arg2,
>> ATSPMVrefarg1(arg0))) ;
>> |
>> ^~~~~~
>> /usr/local/lib/ats2-postiats-0.4.2/ccomp/runtime/pats_ccomp_instrset.h:284:39:
>>
>> note: in definition of macro ‘ATSINSmove_void’
>> 284 | #define ATSINSmove_void(tmp, command) command
>> | ^~~~~~~
>> dict_dats.c:6190:75: warning: implicit declaration of function ‘S2Ecst’
>> [-Wimplicit-function-declaration]
>> 6190 | ATSINSmove_void(tmp195__1,
>> PMVtmpltcstmat[0](array_uninitize$clear<S2Eapp(S2Ecst(BUCKET);
>> S2Eapp(S2Ecst(g0int_t0ype); S2Eextkind(atstype_int)))>)(arg2,
>> ATSPMVrefarg1(arg0))) ;
>> |
>> ^~~~~~
>> /usr/local/lib/ats2-postiats-0.4.2/ccomp/runtime/pats_ccomp_instrset.h:284:39:
>>
>> note: in definition of macro ‘ATSINSmove_void’
>> 284 | #define ATSINSmove_void(tmp, command) command
>> | ^~~~~~~
>> dict_dats.c:6190:82: error: ‘BUCKET’ undeclared (first use in this
>> function)
>> 6190 | ATSINSmove_void(tmp195__1,
>> PMVtmpltcstmat[0](array_uninitize$clear<S2Eapp(S2Ecst(BUCKET);
>> S2Eapp(S2Ecst(g0int_t0ype); S2Eextkind(atstype_int)))>)(arg2,
>> ATSPMVrefarg1(arg0))) ;
>> |
>> ^~~~~~
>> /usr/local/lib/ats2-postiats-0.4.2/ccomp/runtime/pats_ccomp_instrset.h:284:39:
>>
>> note: in definition of macro ‘ATSINSmove_void’
>> 284 | #define ATSINSmove_void(tmp, command) command
>> | ^~~~~~~
>> dict_dats.c:6190:89: error: expected ‘)’ before ‘;’ token
>> 6190 | move_void(tmp195__1,
>> PMVtmpltcstmat[0](array_uninitize$clear<S2Eapp(S2Ecst(BUCKET);
>> S2Eapp(S2Ecst(g0int_t0ype); S2Eextkind(atstype_int)))>)(arg2,
>> ATSPMVrefarg1(arg0))) ;
>> |
>> ~ ^
>>
>> /usr/local/lib/ats2-postiats-0.4.2/ccomp/runtime/pats_ccomp_instrset.h:284:39:
>>
>> note: in definition of macro ‘ATSINSmove_void’
>> 284 | #define ATSINSmove_void(tmp, command) command
>> | ^~~~~~~
>> dict_dats.c:6190:145: error: expected expression before ‘)’ token
>> 6190 | lear<S2Eapp(S2Ecst(BUCKET); S2Eapp(S2Ecst(g0int_t0ype);
>> S2Eextkind(atstype_int)))>)(arg2, ATSPMVrefarg1(arg0))) ;
>> |
>> ^
>>
>> /usr/local/lib/ats2-postiats-0.4.2/ccomp/runtime/pats_ccomp_instrset.h:284:39:
>>
>> note: in definition of macro ‘ATSINSmove_void’
>> 284 | #define ATSINSmove_void(tmp, command) command
>> | ^~~~~~~
>>
>> On Tuesday, December 7, 2021 at 8:08:48 AM UTC-5 d4v3y_5c0n3s wrote:
>>
>>> Thanks, I tried something similar with the "dict" type, but completely
>>> overlooked the "bucket" type. I'll test this to see if it resolves the
>>> issue.
>>>
>>> On Wednesday, December 1, 2021 at 12:28:15 AM UTC-5 gmhwxi wrote:
>>>
>>>> After taking a quick look at dict.sats, I spotted the following line:
>>>>
>>>> absvtype bucket(a:vt@ype)
>>>>
>>>> which should be change to the following one:
>>>>
>>>> absvtype bucket(a:vt@ype) = ptr // ptr takes the compiler the size of
>>>> bucket
>>>>
>>>> The simple reason is that the compiler needs to know the size of an
>>>> abstract type in order to compile it to a type in C.
>>>>
>>>>
>>>> On Wednesday, December 1, 2021 at 12:16:34 AM UTC-5 gmhwxi wrote:
>>>>
>>>>> I don't quite understand.
>>>>> Templates in ATS2 are supposed to be working with abstract types.
>>>>>
>>>>> If I could try precisely what you did on your machine, then I may be
>>>>> able to suggest something.
>>>>>
>>>>>
>>>>>
>>>>> On Tue, Nov 30, 2021 at 8:27 PM d4v3y_5c0n3s <[email protected]> wrote:
>>>>>
>>>>>> Update 2:
>>>>>> After investigating the prelude, I've determined that templates in
>>>>>> ATS2 just conflict with abstract types in some instances. For this
>>>>>> reason,
>>>>>> it seems that in many parts of the prelude avoided the use of the
>>>>>> "assume"
>>>>>> keyword with template-heavy code.
>>>>>>
>>>>>> On Tuesday, November 30, 2021 at 7:08:48 PM UTC-5 d4v3y_5c0n3s wrote:
>>>>>>
>>>>>>> Update:
>>>>>>> I was able to get the code I provided above running by staloading
>>>>>>> the dict.dats file from the dict_test.dats file using " staload _ =
>>>>>>> "./dict.dats" ". Now, my only problem is that if I make the "dict" &
>>>>>>> bucket types abstract, the templates stop working.
>>>>>>>
>>>>>>> On Tuesday, November 30, 2021 at 1:39:39 PM UTC-5 d4v3y_5c0n3s wrote:
>>>>>>>
>>>>>>>> You are right, including " share/atspre_staload.hats" causes the
>>>>>>>> code to compile. However, I'm still having issues. You see, the code
>>>>>>>> I
>>>>>>>> provided I had taken from a static (.sats) and dynamic (.dats) file in
>>>>>>>> order to make it more presentable when asking for help. Your fix only
>>>>>>>> fixes the issue in the single-file version, and when including the
>>>>>>>> external
>>>>>>>> static file it doesn't work. Do you know what might be going wrong?
>>>>>>>> I'll
>>>>>>>> provide the (simplified) contents of each of these files below.
>>>>>>>>
>>>>>>>> *dict.sats*:
>>>>>>>> #include "share/atspre_staload.hats"
>>>>>>>>
>>>>>>>>
>>>>>>>> datavtype BUCKET (a:vt@ype) =
>>>>>>>> | bucket_empty of ()
>>>>>>>> | bucket_filled of (Strptr1, a, BUCKET(a))
>>>>>>>>
>>>>>>>> vtypedef bucket(a:vt@ype) = BUCKET(a)
>>>>>>>>
>>>>>>>> fn{a:vt@ype} bucket_item$delete ( x: a ): void
>>>>>>>>
>>>>>>>> fun{a:vt@ype} bucket_delete_recursive ( b: bucket(a) ) : void
>>>>>>>>
>>>>>>>> sortdef dsz = {s:int | s > 0}
>>>>>>>>
>>>>>>>> vtypedef dict(a:vt@ype, n:int) =
>>>>>>>> @{
>>>>>>>> size=int n,
>>>>>>>> buckets=arrayptr(bucket(a), n)
>>>>>>>> }
>>>>>>>>
>>>>>>>> fn{a:vt@ype} dict_new {s:dsz} ( int s ) : dict(a, s)
>>>>>>>> fn{a:t@ype} dict_delete {s:dsz} ( d: dict(a, s) ) : void
>>>>>>>> fn{a:vt@ype} dict_delete_lin {s:dsz} ( d: dict(a, s) ) : void
>>>>>>>>
>>>>>>>>
>>>>>>>> *dict.dats*:
>>>>>>>> #include "share/atspre_staload.hats"
>>>>>>>>
>>>>>>>> staload "./dict.sats"
>>>>>>>>
>>>>>>>> local
>>>>>>>> in
>>>>>>>>
>>>>>>>>
>>>>>>>> implement{a} dict_new {s} ( size ) = let
>>>>>>>> val size_st = size_of_int(size)
>>>>>>>> val bucket_arr = arrayptr_make_uninitized<bucket(a)>(size_st)
>>>>>>>> implmnt array_initize$init<bucket(a)> (i, x) = x :=
>>>>>>>> bucket_empty()
>>>>>>>> val () = arrayptr_initize<bucket(a)>(bucket_arr, size_st)
>>>>>>>> in
>>>>>>>> @{size=size, buckets=bucket_arr}:dict(a, s)
>>>>>>>> end
>>>>>>>>
>>>>>>>> implmnt{a} dict_delete ( d ) = let
>>>>>>>> implmnt(a2:t@ype) bucket_item$delete<a2> ( x ) = ()
>>>>>>>> in
>>>>>>>> dict_delete_lin<a>(d)
>>>>>>>> end
>>>>>>>>
>>>>>>>> implmnt{a} bucket_delete_recursive ( b ) =
>>>>>>>> case+ b of
>>>>>>>> | ~bucket_empty() => ()
>>>>>>>> | ~bucket_filled(str, x, next_bucket) => let
>>>>>>>> val () = strptr_free(str)
>>>>>>>> val () = bucket_item$delete<a>(x)
>>>>>>>> in
>>>>>>>> bucket_delete_recursive<a>(next_bucket)
>>>>>>>> end
>>>>>>>>
>>>>>>>> implmnt{a} dict_delete_lin ( d ) = let
>>>>>>>> implmnt array_uninitize$clear<bucket(a)> (i, x) =
>>>>>>>> bucket_delete_recursive<a>(x)
>>>>>>>> in
>>>>>>>> arrayptr_freelin(d.buckets, size_of_int(d.size))
>>>>>>>> end
>>>>>>>> end
>>>>>>>>
>>>>>>>> *dict_test.dats*, where main is:
>>>>>>>> #include "share/atspre_staload.hats"
>>>>>>>>
>>>>>>>> staload "./dict.sats"
>>>>>>>>
>>>>>>>>
>>>>>>>> implmnt main0 () = let
>>>>>>>> var d = dict_new<int>(13)
>>>>>>>> in
>>>>>>>> dict_delete(d)
>>>>>>>> end
>>>>>>>>
>>>>>>>> *My output*:
>>>>>>>> $ patscc --gline -DATS_MEMALLOC_LIBC dict_test.dats
>>>>>>>>
>>>>>>>> In file included from dict_test_dats.c:15:
>>>>>>>> /home/tmj90/Goldelish-Engine/source/data/dict_test.dats: In
>>>>>>>> function ‘mainats_0_void’:
>>>>>>>> /home/tmj90/Goldelish-Engine/source/data/dict_test.dats:58:21:
>>>>>>>> error: ‘PMVtmpltcstmat’ undeclared (first use in this function)
>>>>>>>> 58 | var d = dict_new<int>(13)
>>>>>>>> | ^~~~~~~
>>>>>>>>
>>>>>>>> /usr/local/lib/ats2-postiats-0.4.2/ccomp/runtime/pats_ccomp_instrset.h:276:37:
>>>>>>>>
>>>>>>>> note: in definition of macro ‘ATSINSmove’
>>>>>>>> 276 | #define ATSINSmove(tmp, val) (tmp = val)
>>>>>>>> | ^~~
>>>>>>>> /home/tmj90/Goldelish-Engine/source/data/dict_test.dats:58:21:
>>>>>>>> note: each undeclared identifier is reported only once for each
>>>>>>>> function it
>>>>>>>> appears in
>>>>>>>> 58 | var d = dict_new<int>(13)
>>>>>>>> | ^~~~~~~
>>>>>>>>
>>>>>>>> /usr/local/lib/ats2-postiats-0.4.2/ccomp/runtime/pats_ccomp_instrset.h:276:37:
>>>>>>>>
>>>>>>>> note: in definition of macro ‘ATSINSmove’
>>>>>>>> 276 | #define ATSINSmove(tmp, val) (tmp = val)
>>>>>>>> | ^~~
>>>>>>>> /home/tmj90/Goldelish-Engine/source/data/dict_test.dats:58:39:
>>>>>>>> error: ‘dict_new’ undeclared (first use in this function)
>>>>>>>> 58 | var d = dict_new<int>(13)
>>>>>>>>
>>>>>>>> | ^
>>>>>>>> /usr/local/lib/ats2-postiats-0.4.2/ccomp/runtime/pats_ccomp_instrset.h:276:37:
>>>>>>>>
>>>>>>>> note: in definition of macro ‘ATSINSmove’
>>>>>>>> 276 | #define ATSINSmove(tmp, val) (tmp = val)
>>>>>>>> | ^~~
>>>>>>>> /home/tmj90/Goldelish-Engine/source/data/dict_test.dats:58:48:
>>>>>>>> warning: implicit declaration of function ‘S2Eapp’
>>>>>>>> [-Wimplicit-function-declaration]
>>>>>>>> 58 | var d = dict_new<int>(13)
>>>>>>>>
>>>>>>>> | ^
>>>>>>>> /usr/local/lib/ats2-postiats-0.4.2/ccomp/runtime/pats_ccomp_instrset.h:276:37:
>>>>>>>>
>>>>>>>> note: in definition of macro ‘ATSINSmove’
>>>>>>>> 276 | #define ATSINSmove(tmp, val) (tmp = val)
>>>>>>>> | ^~~
>>>>>>>> /home/tmj90/Goldelish-Engine/source/data/dict_test.dats:58:55:
>>>>>>>> warning: implicit declaration of function ‘S2Ecst’
>>>>>>>> [-Wimplicit-function-declaration]
>>>>>>>> 58 | var d = dict_new<int>(13)
>>>>>>>>
>>>>>>>> | ^
>>>>>>>> /usr/local/lib/ats2-postiats-0.4.2/ccomp/runtime/pats_ccomp_instrset.h:276:37:
>>>>>>>>
>>>>>>>> note: in definition of macro ‘ATSINSmove’
>>>>>>>> 276 | #define ATSINSmove(tmp, val) (tmp = val)
>>>>>>>> | ^~~
>>>>>>>> /home/tmj90/Goldelish-Engine/source/data/dict_test.dats:58:62:
>>>>>>>> error: ‘g0int_t0ype’ undeclared (first use in this function)
>>>>>>>> 58 | var d = dict_new<int>(13)
>>>>>>>>
>>>>>>>>
>>>>>>>> | ^
>>>>>>>>
>>>>>>>> /usr/local/lib/ats2-postiats-0.4.2/ccomp/runtime/pats_ccomp_instrset.h:276:37:
>>>>>>>>
>>>>>>>> note: in definition of macro ‘ATSINSmove’
>>>>>>>> 276 | #define ATSINSmove(tmp, val) (tmp = val)
>>>>>>>> | ^~~
>>>>>>>> /home/tmj90/Goldelish-Engine/source/data/dict_test.dats:58:74:
>>>>>>>> error: expected ‘)’ before ‘;’ token
>>>>>>>> 58 | var d = dict_new<int>(13)
>>>>>>>>
>>>>>>>>
>>>>>>>> |
>>>>>>>> ^
>>>>>>>> /usr/local/lib/ats2-postiats-0.4.2/ccomp/runtime/pats_ccomp_instrset.h:276:37:
>>>>>>>>
>>>>>>>> note: in definition of macro ‘ATSINSmove’
>>>>>>>> 276 | #define ATSINSmove(tmp, val) (tmp = val)
>>>>>>>> | ^~~
>>>>>>>> /home/tmj90/Goldelish-Engine/source/data/dict_test.dats:58:101:
>>>>>>>> error: expected expression before ‘)’ token
>>>>>>>> 58 | var d = dict_new<int>(13)
>>>>>>>>
>>>>>>>>
>>>>>>>> |
>>>>>>>>
>>>>>>>> ^
>>>>>>>> /usr/local/lib/ats2-postiats-0.4.2/ccomp/runtime/pats_ccomp_instrset.h:276:37:
>>>>>>>>
>>>>>>>> note: in definition of macro ‘ATSINSmove’
>>>>>>>> 276 | #define ATSINSmove(tmp, val) (tmp = val)
>>>>>>>> | ^~~
>>>>>>>> /home/tmj90/Goldelish-Engine/source/data/dict_test.dats:60:44:
>>>>>>>> error: ‘dict_delete’ undeclared (first use in this function); did you
>>>>>>>> mean
>>>>>>>> ‘timer_delete’?
>>>>>>>> 60 | dict_delete(d)
>>>>>>>>
>>>>>>>> | ^
>>>>>>>> /usr/local/lib/ats2-postiats-0.4.2/ccomp/runtime/pats_ccomp_instrset.h:284:39:
>>>>>>>>
>>>>>>>> note: in definition of macro ‘ATSINSmove_void’
>>>>>>>> 284 | #define ATSINSmove_void(tmp, command) command
>>>>>>>> | ^~~~~~~
>>>>>>>> /home/tmj90/Goldelish-Engine/source/data/dict_test.dats:60:82:
>>>>>>>> error: expected ‘)’ before ‘;’ token
>>>>>>>> 60 | dict_delete(d)
>>>>>>>>
>>>>>>>>
>>>>>>>> |
>>>>>>>>
>>>>>>>> ^
>>>>>>>> /usr/local/lib/ats2-postiats-0.4.2/ccomp/runtime/pats_ccomp_instrset.h:284:39:
>>>>>>>>
>>>>>>>> note: in definition of macro ‘ATSINSmove_void’
>>>>>>>> 284 | #define ATSINSmove_void(tmp, command) command
>>>>>>>> | ^~~~~~~
>>>>>>>> /home/tmj90/Goldelish-Engine/source/data/dict_test.dats:60:109:
>>>>>>>> error: expected expression before ‘)’ token
>>>>>>>> 60 | dict_delete(d)
>>>>>>>>
>>>>>>>>
>>>>>>>> |
>>>>>>>>
>>>>>>>> ^
>>>>>>>> /usr/local/lib/ats2-postiats-0.4.2/ccomp/runtime/pats_ccomp_instrset.h:284:39:
>>>>>>>>
>>>>>>>> note: in definition of macro ‘ATSINSmove_void’
>>>>>>>> 284 | #define ATSINSmove_void(tmp, command) command
>>>>>>>> | ^~~~~~~
>>>>>>>> On Tuesday, November 30, 2021 at 11:28:47 AM UTC-5 gmhwxi wrote:
>>>>>>>>
>>>>>>>>> I tried your code and it compiled without any issue.
>>>>>>>>>
>>>>>>>>> Did you have the following line at the top:
>>>>>>>>>
>>>>>>>>> #include "share/atspre_staload.hats"
>>>>>>>>>
>>>>>>>>> The error messages you showed indicate that many template
>>>>>>>>> implementations were not
>>>>>>>>> available to the compiler (patsopt).
>>>>>>>>>
>>>>>>>>> --Hongwei
>>>>>>>>>
>>>>>>>>>
>>>>>>>>> On Tue, Nov 30, 2021 at 10:52 AM d4v3y_5c0n3s <[email protected]>
>>>>>>>>> wrote:
>>>>>>>>>
>>>>>>>>>> Okay, so I've been struggling with my use of templates for a
>>>>>>>>>> while now, and I'm making this post to get some more eyes on the
>>>>>>>>>> issue.
>>>>>>>>>> I've been getting really frustrated, because nothing I've tried
>>>>>>>>>> seems to
>>>>>>>>>> work, and I have no way to understand what is going wrong whatsoever
>>>>>>>>>> besides becoming familiar with compiler internals (which could take
>>>>>>>>>> who
>>>>>>>>>> knows how long to learn.)
>>>>>>>>>>
>>>>>>>>>> Here's my code:
>>>>>>>>>> datavtype BUCKET (a:vt@ype) =
>>>>>>>>>> | bucket_empty of ()
>>>>>>>>>> | bucket_filled of (Strptr1, a, BUCKET(a))
>>>>>>>>>>
>>>>>>>>>> vtypedef bucket(a:vt@ype) = BUCKET(a)
>>>>>>>>>>
>>>>>>>>>> sortdef dsz = {s:int | s > 0}
>>>>>>>>>>
>>>>>>>>>> vtypedef dict(a:vt@ype, n:int) =
>>>>>>>>>> @{
>>>>>>>>>> size=int n,
>>>>>>>>>> buckets=arrayptr(bucket(a), n)
>>>>>>>>>> }
>>>>>>>>>>
>>>>>>>>>> extern fn{a:vt@ype} dict_new {s:dsz} ( int s ) : dict(a, s)
>>>>>>>>>> extern fn{a:t@ype} dict_delete {s:dsz} ( d: dict(a, s) ) : void
>>>>>>>>>> extern fn{a:vt@ype} dict_delete_lin {s:dsz} ( d: dict(a, s) ) :
>>>>>>>>>> void
>>>>>>>>>>
>>>>>>>>>> extern fun{a:vt@ype} bucket_delete_recursive ( b: bucket(a) ) :
>>>>>>>>>> void
>>>>>>>>>> extern fn{a:vt@ype} bucket_item$delete ( x: a ): void
>>>>>>>>>>
>>>>>>>>>> implement{a} dict_new {s} ( size ) = let
>>>>>>>>>> val size_st = size_of_int(size)
>>>>>>>>>> val bucket_arr = arrayptr_make_uninitized<bucket(a)>(size_st)
>>>>>>>>>> implmnt array_initize$init<bucket(a)> (i, x) = x :=
>>>>>>>>>> bucket_empty()
>>>>>>>>>> val () = arrayptr_initize<bucket(a)>(bucket_arr, size_st)
>>>>>>>>>> in
>>>>>>>>>> @{size=size, buckets=bucket_arr}:dict(a, s)
>>>>>>>>>> end
>>>>>>>>>>
>>>>>>>>>> implmnt{a} dict_delete ( d ) = let
>>>>>>>>>> implmnt(a2:t@ype) bucket_item$delete<a2> ( x ) = ()
>>>>>>>>>> in
>>>>>>>>>> dict_delete_lin<a>(d)
>>>>>>>>>> end
>>>>>>>>>>
>>>>>>>>>> implmnt{a} bucket_delete_recursive ( b ) =
>>>>>>>>>> case+ b of
>>>>>>>>>> | ~bucket_empty() => ()
>>>>>>>>>> | ~bucket_filled(str, x, next_bucket) => let
>>>>>>>>>> val () = strptr_free(str)
>>>>>>>>>> val () = bucket_item$delete<a>(x)
>>>>>>>>>> in
>>>>>>>>>> bucket_delete_recursive<a>(next_bucket)
>>>>>>>>>> end
>>>>>>>>>>
>>>>>>>>>> implmnt{a} dict_delete_lin ( d ) = let
>>>>>>>>>> implmnt array_uninitize$clear<bucket(a)> (i, x) =
>>>>>>>>>> bucket_delete_recursive<a>(x)
>>>>>>>>>> in
>>>>>>>>>> arrayptr_freelin(d.buckets, size_of_int(d.size))
>>>>>>>>>> end
>>>>>>>>>>
>>>>>>>>>> implmnt main0 () = let
>>>>>>>>>> var d = dict_new<int>(13)
>>>>>>>>>> in
>>>>>>>>>> dict_delete(d)
>>>>>>>>>> end
>>>>>>>>>>
>>>>>>>>>>
>>>>>>>>>> Here's the output:
>>>>>>>>>> $ patscc --gline dict_test.dats
>>>>>>>>>> In file included from dict_test_dats.c:15:
>>>>>>>>>> /home/tmj90/Goldelish-Engine/source/data/dict_test.dats: In
>>>>>>>>>> function
>>>>>>>>>> ‘_057_home_057_tmj90_057_Goldelish_055_Engine_057_source_057_data_057_dict_test_056_dats__dict_new__0__1’:
>>>>>>>>>> /home/tmj90/Goldelish-Engine/source/data/dict_test.dats:24:21:
>>>>>>>>>> error: ‘PMVtmpltcstmat’ undeclared (first use in this function)
>>>>>>>>>> 24 | val bucket_arr =
>>>>>>>>>> arrayptr_make_uninitized<bucket(a)>(size_st)
>>>>>>>>>> | ^~~~~~~~~~~~~~
>>>>>>>>>> /usr/local/lib/ats2-postiats-0.4.2/ccomp/runtime/pats_ccomp_instrset.h:276:37:
>>>>>>>>>>
>>>>>>>>>> note: in definition of macro ‘ATSINSmove’
>>>>>>>>>> 276 | #define ATSINSmove(tmp, val) (tmp = val)
>>>>>>>>>> | ^~~
>>>>>>>>>> /home/tmj90/Goldelish-Engine/source/data/dict_test.dats:24:21:
>>>>>>>>>> note: each undeclared identifier is reported only once for each
>>>>>>>>>> function it
>>>>>>>>>> appears in
>>>>>>>>>> 24 | val bucket_arr =
>>>>>>>>>> arrayptr_make_uninitized<bucket(a)>(size_st)
>>>>>>>>>> | ^~~~~~~~~~~~~~
>>>>>>>>>> /usr/local/lib/ats2-postiats-0.4.2/ccomp/runtime/pats_ccomp_instrset.h:276:37:
>>>>>>>>>>
>>>>>>>>>> note: in definition of macro ‘ATSINSmove’
>>>>>>>>>> 276 | #define ATSINSmove(tmp, val) (tmp = val)
>>>>>>>>>> | ^~~
>>>>>>>>>> /home/tmj90/Goldelish-Engine/source/data/dict_test.dats:24:39:
>>>>>>>>>> error: ‘arrayptr_make_uninitized’ undeclared (first use in this
>>>>>>>>>> function)
>>>>>>>>>> 24 | val bucket_arr =
>>>>>>>>>> arrayptr_make_uninitized<bucket(a)>(size_st)
>>>>>>>>>> |
>>>>>>>>>> ^~~~~~~~~~~~~~~~~~~~~~~~
>>>>>>>>>> /usr/local/lib/ats2-postiats-0.4.2/ccomp/runtime/pats_ccomp_instrset.h:276:37:
>>>>>>>>>>
>>>>>>>>>> note: in definition of macro ‘ATSINSmove’
>>>>>>>>>> 276 | #define ATSINSmove(tmp, val) (tmp = val)
>>>>>>>>>> | ^~~
>>>>>>>>>> /home/tmj90/Goldelish-Engine/source/data/dict_test.dats:24:64:
>>>>>>>>>> warning: implicit declaration of function ‘S2Eapp’
>>>>>>>>>> [-Wimplicit-function-declaration]
>>>>>>>>>> 24 | val bucket_arr =
>>>>>>>>>> arrayptr_make_uninitized<bucket(a)>(size_st)
>>>>>>>>>>
>>>>>>>>>> | ^~
>>>>>>>>>>
>>>>>>>>>> /usr/local/lib/ats2-postiats-0.4.2/ccomp/runtime/pats_ccomp_instrset.h:276:37:
>>>>>>>>>>
>>>>>>>>>> note: in definition of macro ‘ATSINSmove’
>>>>>>>>>> 276 | #define ATSINSmove(tmp, val) (tmp = val)
>>>>>>>>>> | ^~~
>>>>>>>>>> /home/tmj90/Goldelish-Engine/source/data/dict_test.dats:24:71:
>>>>>>>>>> warning: implicit declaration of function ‘S2Ecst’
>>>>>>>>>> [-Wimplicit-function-declaration]
>>>>>>>>>> 24 | val bucket_arr =
>>>>>>>>>> arrayptr_make_uninitized<bucket(a)>(size_st)
>>>>>>>>>>
>>>>>>>>>> |
>>>>>>>>>>
>>>>>>>>>> ^
>>>>>>>>>> /usr/local/lib/ats2-postiats-0.4.2/ccomp/runtime/pats_ccomp_instrset.h:276:37:
>>>>>>>>>>
>>>>>>>>>> note: in definition of macro ‘ATSINSmove’
>>>>>>>>>> 276 | #define ATSINSmove(tmp, val) (tmp = val)
>>>>>>>>>> | ^~~
>>>>>>>>>> /home/tmj90/Goldelish-Engine/source/data/dict_test.dats:24:78:
>>>>>>>>>> error: ‘BUCKET’ undeclared (first use in this function)
>>>>>>>>>> 24 | val bucket_arr =
>>>>>>>>>> arrayptr_make_uninitized<bucket(a)>(size_st)
>>>>>>>>>>
>>>>>>>>>> |
>>>>>>>>>>
>>>>>>>>>> ^
>>>>>>>>>> /usr/local/lib/ats2-postiats-0.4.2/ccomp/runtime/pats_ccomp_instrset.h:276:37:
>>>>>>>>>>
>>>>>>>>>> note: in definition of macro ‘ATSINSmove’
>>>>>>>>>> 276 | #define ATSINSmove(tmp, val) (tmp = val)
>>>>>>>>>> | ^~~
>>>>>>>>>> /home/tmj90/Goldelish-Engine/source/data/dict_test.dats:24:85:
>>>>>>>>>> error: expected ‘)’ before ‘;’ token
>>>>>>>>>> 24 | val bucket_arr =
>>>>>>>>>> arrayptr_make_uninitized<bucket(a)>(size_st)
>>>>>>>>>>
>>>>>>>>>> |
>>>>>>>>>>
>>>>>>>>>> ^
>>>>>>>>>> /usr/local/lib/ats2-postiats-0.4.2/ccomp/runtime/pats_ccomp_instrset.h:276:37:
>>>>>>>>>>
>>>>>>>>>> note: in definition of macro ‘ATSINSmove’
>>>>>>>>>> 276 | #define ATSINSmove(tmp, val) (tmp = val)
>>>>>>>>>> | ^~~
>>>>>>>>>> /home/tmj90/Goldelish-Engine/source/data/dict_test.dats:24:141:
>>>>>>>>>> error: expected expression before ‘)’ token
>>>>>>>>>> 24 | val bucket_arr =
>>>>>>>>>> arrayptr_make_uninitized<bucket(a)>(size_st)
>>>>>>>>>>
>>>>>>>>>> |
>>>>>>>>>>
>>>>>>>>>>
>>>>>>>>>> ^
>>>>>>>>>> /usr/local/lib/ats2-postiats-0.4.2/ccomp/runtime/pats_ccomp_instrset.h:276:37:
>>>>>>>>>>
>>>>>>>>>> note: in definition of macro ‘ATSINSmove’
>>>>>>>>>> 276 | #define ATSINSmove(tmp, val) (tmp = val)
>>>>>>>>>> | ^~~
>>>>>>>>>> /home/tmj90/Goldelish-Engine/source/data/dict_test.dats:26:44:
>>>>>>>>>> error: ‘arrayptr_initize’ undeclared (first use in this function)
>>>>>>>>>> 26 | val () = arrayptr_initize<bucket(a)>(bucket_arr,
>>>>>>>>>> size_st)
>>>>>>>>>> |
>>>>>>>>>> ^~~~~~~~~~~~~~~~
>>>>>>>>>> /usr/local/lib/ats2-postiats-0.4.2/ccomp/runtime/pats_ccomp_instrset.h:284:39:
>>>>>>>>>>
>>>>>>>>>> note: in definition of macro ‘ATSINSmove_void’
>>>>>>>>>> 284 | #define ATSINSmove_void(tmp, command) command
>>>>>>>>>> | ^~~~~~~
>>>>>>>>>> /home/tmj90/Goldelish-Engine/source/data/dict_test.dats:26:82:
>>>>>>>>>> error: expected ‘)’ before ‘;’ token
>>>>>>>>>> 26 | val () = arrayptr_initize<bucket(a)>(bucket_arr,
>>>>>>>>>> size_st)
>>>>>>>>>>
>>>>>>>>>> |
>>>>>>>>>>
>>>>>>>>>> ^
>>>>>>>>>> /usr/local/lib/ats2-postiats-0.4.2/ccomp/runtime/pats_ccomp_instrset.h:284:39:
>>>>>>>>>>
>>>>>>>>>> note: in definition of macro ‘ATSINSmove_void’
>>>>>>>>>> 284 | #define ATSINSmove_void(tmp, command) command
>>>>>>>>>> | ^~~~~~~
>>>>>>>>>> /home/tmj90/Goldelish-Engine/source/data/dict_test.dats:26:138:
>>>>>>>>>> error: expected expression before ‘)’ token
>>>>>>>>>> 26 | val () = arrayptr_initize<bucket(a)>(bucket_arr,
>>>>>>>>>> size_st)
>>>>>>>>>>
>>>>>>>>>> |
>>>>>>>>>>
>>>>>>>>>>
>>>>>>>>>> ^
>>>>>>>>>> /usr/local/lib/ats2-postiats-0.4.2/ccomp/runtime/pats_ccomp_instrset.h:284:39:
>>>>>>>>>>
>>>>>>>>>> note: in definition of macro ‘ATSINSmove_void’
>>>>>>>>>> 284 | #define ATSINSmove_void(tmp, command) command
>>>>>>>>>> | ^~~~~~~
>>>>>>>>>> /home/tmj90/Goldelish-Engine/source/data/dict_test.dats: In
>>>>>>>>>> function
>>>>>>>>>> ‘_057_home_057_tmj90_057_Goldelish_055_Engine_057_source_057_data_057_dict_test_056_dats__dict_delete_lin__5__1’:
>>>>>>>>>> /home/tmj90/Goldelish-Engine/source/data/dict_test.dats:50:30:
>>>>>>>>>> error: ‘PMVtmpltcstmat’ undeclared (first use in this function)
>>>>>>>>>> 50 | arrayptr_freelin(d.buckets, size_of_int(d.size))
>>>>>>>>>> | ^~~~~~~~~~~~~~
>>>>>>>>>> /usr/local/lib/ats2-postiats-0.4.2/ccomp/runtime/pats_ccomp_instrset.h:284:39:
>>>>>>>>>>
>>>>>>>>>> note: in definition of macro ‘ATSINSmove_void’
>>>>>>>>>> 284 | #define ATSINSmove_void(tmp, command) command
>>>>>>>>>> | ^~~~~~~
>>>>>>>>>> /home/tmj90/Goldelish-Engine/source/data/dict_test.dats:50:48:
>>>>>>>>>> error: ‘arrayptr_freelin’ undeclared (first use in this function)
>>>>>>>>>> 50 | arrayptr_freelin(d.buckets, size_of_int(d.size))
>>>>>>>>>> |
>>>>>>>>>> ^~~
>>>>>>>>>> /usr/local/lib/ats2-postiats-0.4.2/ccomp/runtime/pats_ccomp_instrset.h:284:39:
>>>>>>>>>>
>>>>>>>>>> note: in definition of macro ‘ATSINSmove_void’
>>>>>>>>>> 284 | #define ATSINSmove_void(tmp, command) command
>>>>>>>>>> | ^~~~~~~
>>>>>>>>>> /home/tmj90/Goldelish-Engine/source/data/dict_test.dats:50:79:
>>>>>>>>>> error: ‘BUCKET’ undeclared (first use in this function)
>>>>>>>>>> 50 | arrayptr_freelin(d.buckets, size_of_int(d.size))
>>>>>>>>>>
>>>>>>>>>> |
>>>>>>>>>>
>>>>>>>>>> ^
>>>>>>>>>> /usr/local/lib/ats2-postiats-0.4.2/ccomp/runtime/pats_ccomp_instrset.h:284:39:
>>>>>>>>>>
>>>>>>>>>> note: in definition of macro ‘ATSINSmove_void’
>>>>>>>>>> 284 | #define ATSINSmove_void(tmp, command) command
>>>>>>>>>> | ^~~~~~~
>>>>>>>>>> /home/tmj90/Goldelish-Engine/source/data/dict_test.dats:50:86:
>>>>>>>>>> error: expected ‘)’ before ‘;’ token
>>>>>>>>>> 50 | arrayptr_freelin(d.buckets, size_of_int(d.size))
>>>>>>>>>>
>>>>>>>>>> |
>>>>>>>>>>
>>>>>>>>>> ^
>>>>>>>>>> /usr/local/lib/ats2-postiats-0.4.2/ccomp/runtime/pats_ccomp_instrset.h:284:39:
>>>>>>>>>>
>>>>>>>>>> note: in definition of macro ‘ATSINSmove_void’
>>>>>>>>>> 284 | #define ATSINSmove_void(tmp, command) command
>>>>>>>>>> | ^~~~~~~
>>>>>>>>>> /home/tmj90/Goldelish-Engine/source/data/dict_test.dats:50:142:
>>>>>>>>>> error: expected expression before ‘)’ token
>>>>>>>>>> 50 | arrayptr_freelin(d.buckets, size_of_int(d.size))
>>>>>>>>>>
>>>>>>>>>> |
>>>>>>>>>>
>>>>>>>>>>
>>>>>>>>>> ^
>>>>>>>>>> /usr/local/lib/ats2-postiats-0.4.2/ccomp/runtime/pats_ccomp_instrset.h:284:39:
>>>>>>>>>>
>>>>>>>>>> note: in definition of macro ‘ATSINSmove_void’
>>>>>>>>>> 284 | #define ATSINSmove_void(tmp, command) command
>>>>>>>>>> | ^~~~~~~
>>>>>>>>>>
>>>>>>>>>> Any help is greatly appreciated, and let me know if you have any
>>>>>>>>>> questions. Thank you.
>>>>>>>>>>
>>>>>>>>>> --
>>>>>>>>>> You received this message because you are subscribed to the
>>>>>>>>>> Google Groups "ats-lang-users" group.
>>>>>>>>>> To unsubscribe from this group and stop receiving emails from it,
>>>>>>>>>> send an email to [email protected].
>>>>>>>>>> To view this discussion on the web visit
>>>>>>>>>> https://groups.google.com/d/msgid/ats-lang-users/d42e5377-0287-4311-9b39-716235b7a0c3n%40googlegroups.com
>>>>>>>>>>
>>>>>>>>>> <https://groups.google.com/d/msgid/ats-lang-users/d42e5377-0287-4311-9b39-716235b7a0c3n%40googlegroups.com?utm_medium=email&utm_source=footer>
>>>>>>>>>> .
>>>>>>>>>>
>>>>>>>>> --
>>>>>> You received this message because you are subscribed to the Google
>>>>>> Groups "ats-lang-users" group.
>>>>>> To unsubscribe from this group and stop receiving emails from it,
>>>>>> send an email to [email protected].
>>>>>>
>>>>> To view this discussion on the web visit
>>>>>> https://groups.google.com/d/msgid/ats-lang-users/8f8bd20f-8ec3-4008-ae28-e28b013d8069n%40googlegroups.com
>>>>>>
>>>>>> <https://groups.google.com/d/msgid/ats-lang-users/8f8bd20f-8ec3-4008-ae28-e28b013d8069n%40googlegroups.com?utm_medium=email&utm_source=footer>
>>>>>> .
>>>>>>
>>>>> --
>>
> You received this message because you are subscribed to a topic in the
>> Google Groups "ats-lang-users" group.
>> To unsubscribe from this topic, visit
>> https://groups.google.com/d/topic/ats-lang-users/sZgQapU08Bo/unsubscribe.
>> To unsubscribe from this group and all its topics, send an email to
>> [email protected].
>> To view this discussion on the web visit
>> https://groups.google.com/d/msgid/ats-lang-users/19270152-47db-4f7a-adf4-247b1adedd4dn%40googlegroups.com
>>
>> <https://groups.google.com/d/msgid/ats-lang-users/19270152-47db-4f7a-adf4-247b1adedd4dn%40googlegroups.com?utm_medium=email&utm_source=footer>
>> .
>>
>
--
You received this message because you are subscribed to the Google Groups
"ats-lang-users" group.
To unsubscribe from this group and stop receiving emails from it, send an email
to [email protected].
To view this discussion on the web visit
https://groups.google.com/d/msgid/ats-lang-users/787ea3b9-d40c-45bb-89e3-8713a151c000n%40googlegroups.com.