Right now, ATS2 cannot properly support the use of function types as template parameters. I have no plan to fix it. Though, I expect that ATS3 be implemented to properly handle function types as template parameters.
On Wed, Jun 26, 2019 at 12:16 PM M88 <[email protected]> wrote: > > This is how I get around the issue: > > > typedef Foo = @{ > f = (&int) -> void > } > > abstflt foo = Foo > extern castfn reveal ( foo ) : Foo > extern castfn conceal ( Foo ) : foo > > impltmp > do_something<foo>( x ) = > let > val xx = reveal ( x ) > var z : int = 0 > in xx.f( z ) > end > > implfun main0 () > = println!("Hello world") > where { > var ff : Foo = (@{ > f = lam(x) => println!(x) > }) : Foo > > val _ = do_something<foo>( conceal( ff ) ) > > > } > > > > I did a little bit more testing, using the following definitions for "foo". > > > // Case 1 > absprop FOO > typedef foo = @{ > f = (FOO | int) -> void > } > // Case 2 > absview FOO > typedef foo = @{ > f = ( FOO | int ) -> void > } > // Case 3 > typedef foo = @{ > f = {l:addr}( !(int @ l) | ptr l ) -> void > } > > > > > The first two cases worked as expected, but the last one failed in the > same way. Maybe the issue is with at-views and template dispatch, > specifically. > > > On Wednesday, June 26, 2019 at 8:13:41 AM UTC-4, Richard wrote: >> >> On Tuesday, June 25, 2019 at 9:47:50 AM UTC-4, M88 wrote: >> > I noticed this a while ago in ATS2 (just verified in Temptory). >> > >> > >> > >> > It seems that call-by-reference functions in record definitions cause >> issues with template dispatch. >> > >> >> From what I can tell after some testing, a type defined as a function >> with call-by-reference seems to cause the same issue (even outside >> records). >> >> > >> > The following will fail to compile ( no match for `do_something` ) -- >> changing the signature of `foo.f` to `(int) -> void` will compile >> successfully. >> > >> > >> > >> > >> > >> > >> > #include "share/HATS/temptory_staload_bucs320.hats" >> > >> > typedef foo = @{ >> > f = (&int) -> void >> > } >> > >> > extern >> > fun {a:vtflt} do_something( a ) : void >> > >> > impltmp >> > do_something<foo>( x ) = >> > let >> > var z : int = 0 >> > in x.f(z) >> > end >> > >> > implfun main0() >> > = println!("Hello [test0]") >> > where { >> > var ff : foo = (@{ >> > f = lam(x) => println!(x) >> > }): foo >> > >> > val () = do_something<foo>(ff) >> > } >> > >> > >> > >> > >> > I've been using abstract types / casting as a work-around. >> >> Could you share how you use abstract type / casting in this example to >> get it to work? >> > -- > You received this message because you are subscribed to the Google Groups > "ats-lang-users" group. > To unsubscribe from this group and stop receiving emails from it, send an > email to [email protected]. > To post to this group, send email to [email protected]. > Visit this group at https://groups.google.com/group/ats-lang-users. > To view this discussion on the web visit > https://groups.google.com/d/msgid/ats-lang-users/8d5f8598-9955-43d8-9249-a7a5b222676d%40googlegroups.com > <https://groups.google.com/d/msgid/ats-lang-users/8d5f8598-9955-43d8-9249-a7a5b222676d%40googlegroups.com?utm_medium=email&utm_source=footer> > . > -- You received this message because you are subscribed to the Google Groups "ats-lang-users" group. To unsubscribe from this group and stop receiving emails from it, send an email to [email protected]. To post to this group, send email to [email protected]. Visit this group at https://groups.google.com/group/ats-lang-users. To view this discussion on the web visit https://groups.google.com/d/msgid/ats-lang-users/CAPPSPLqi8%2BC3ES%2BRrPY9Vr2RkGXJP8UhnnDh%3DXzRZiwpy7w1Jg%40mail.gmail.com.
