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-users+unsubscr...@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.

Reply via email to