Help with Templates, cannot find missing implementation somewhere...

81 views
Skip to first unread message

d4v3y_5c0n3s

unread,
Nov 30, 2021, 10:52:47 AM11/30/21
to ats-lang-users
    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.

Hongwei Xi

unread,
Nov 30, 2021, 11:28:47 AM11/30/21
to ats-lan...@googlegroups.com
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


--
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.

d4v3y_5c0n3s

unread,
Nov 30, 2021, 1:39:39 PM11/30/21
to ats-lang-users
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
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
      |                                       ^~~~~~~

d4v3y_5c0n3s

unread,
Nov 30, 2021, 7:08:48 PM11/30/21
to ats-lang-users
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.

d4v3y_5c0n3s

unread,
Nov 30, 2021, 8:27:46 PM11/30/21
to ats-lang-users
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.

Hongwei Xi

unread,
Dec 1, 2021, 12:16:34 AM12/1/21
to ats-lan...@googlegroups.com
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.



gmhwxi

unread,
Dec 1, 2021, 12:28:15 AM12/1/21
to ats-lang-users
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.

d4v3y_5c0n3s

unread,
Dec 7, 2021, 8:08:48 AM12/7/21
to ats-lang-users
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.

d4v3y_5c0n3s

unread,
Dec 30, 2021, 12:47:42 PM12/30/21
to ats-lang-users
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
      |                                       ^~~~~~~

Hongwei Xi

unread,
Dec 30, 2021, 2:48:29 PM12/30/21
to ats-lan...@googlegroups.com
Where can I find your source code so that I can produce the error you are referring to?

--Hongwei


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.

d4v3y_5c0n3s

unread,
Dec 30, 2021, 6:07:31 PM12/30/21
to ats-lang-users
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
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)

gmhwxi

unread,
Dec 30, 2021, 9:00:48 PM12/30/21
to ats-lang-users
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)

gmhwxi

unread,
Dec 30, 2021, 9:28:57 PM12/30/21
to ats-lang-users
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

d4v3y_5c0n3s

unread,
Jan 1, 2022, 4:00:43 PM1/1/22
to ats-lang-users
That seems to have fixed my issue, thanks.  :)
Reply all
Reply to author
Forward
0 new messages