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-users+unsubscr...@googlegroups.com. To view this discussion on the web visit https://groups.google.com/d/msgid/ats-lang-users/e358a6f5-238a-443b-843a-3cc3491972d3n%40googlegroups.com.