Or you could supply a template parameter (bucket(a) in this case) to arrayptr_freelin:
implmnt{a} dict_delete_lin ( d ) = let implmnt array_uninitize$clear<bucket(a)> (i, x) = bucket_delete_recursive<a>(x) in arrayptr_freelin<bucket(a)>(d.buckets, size_of_int(d.size)) end On Thursday, December 30, 2021 at 9:00:48 PM UTC-5 gmhwxi wrote: > Just need to replace bucket(a) with BUCKET(a) as is shown below: > > implmnt array_uninitize$clear<BUCKET(a)> (i, x) = > bucket_delete_recursive<a>(x) > > On Thursday, December 30, 2021 at 6:07:31 PM UTC-5 d4v3y_5c0n3s wrote: > >> 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 <tmj...@gmail.com> 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 <tmj...@gmail.com> >>>>>>> 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 <tmj...@gmail.com> >>>>>>>>>>> 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 ats-lang-user...@googlegroups.com. >>>>>>>>>>>> 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 ats-lang-user...@googlegroups.com. >>>>>>>> >>>>>>> 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 >>>> ats-lang-user...@googlegroups.com. >>>> 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 ats-lang-users+unsubscr...@googlegroups.com. To view this discussion on the web visit https://groups.google.com/d/msgid/ats-lang-users/34464013-1e2f-4f18-b810-1d61dfeb3df2n%40googlegroups.com.