Oh, you're right! I can get the demo working now :)

Thanks again,
Vanessa

On Monday, November 18, 2019 at 11:25:12 PM UTC-6, gmhwxi wrote:
>
> Took a closer look.
>
> 'atstype_var' should be changed to 'atstype_boxed'.
>
> The real problem is due to 'pop' being given an incorrect type.
> I tried the following type to make the code work:
>
>   extern
>   fun pop {a:type}(&stack_t(a) >> _) : (a) = "ext#pop_ats"
>
> To mix C with ATS can be difficult. In particular, there is not much
> documentation to help.
>
> If you want Option(a) as the return type of 'pop', 'return x' in __cats_pop
> needs to be changed to 'return __cats_some(x)' where '__cats_some' can
> be implemented as follows:
>
> extern
> fun
> none{a:type}(): Option(a) = "__cats_none"
> extern
> fun
> some{a:type}(x:a): Option(a) = "__cats_some"
>
> implement none() = None()
> implement some(x) = Some(x)
>
> Frankly speaking, without documentation, I don't feel that ATS2 is ready
> for you to do what you wanted here.
>
> On Mon, Nov 18, 2019 at 10:44 PM Vanessa McHale <vamc...@gmail.com 
> <javascript:>> wrote:
>
>> Thanks for the response!
>>
>> Unfortunately I still get trouble, viz.
>>
>> ...
>>
>> atstype_boxed pop_ats(atstype_ref st) { return __cats_pop(st); }
>>
>> atsvoid_t0ype new_ats(atstype_ref st) { __cats_new(st); }
>>
>> atsvoid_t0ype push_ats(atstype_ref st, atstype_boxed val) {
>>     __cats_push(st, val);
>> }
>> %}
>>
>> typedef stack_t(a: type) = $extype "struct stack_t"
>>
>> extern
>> fun new {a:type}(&stack_t(a)? >> _) : void =
>>   "ext#new_ats"
>>
>> extern
>> fun push {a:type}(&stack_t(a) >> _, a) : void =
>>   "ext#push_ats"
>>
>> extern
>> fun pop {a:type}(&stack_t(a) >> _) : Option(a) =
>>   "ext#pop_ats"
>>
>> fn print_str(x : string) : void =
>>   println!(x)
>>
>> ...
>>
>> leads to a segfault as before.
>>
>> Cheers,
>> Vanessa
>>
>> On Sunday, November 17, 2019 at 10:18:54 PM UTC-6, gmhwxi wrote:
>>>
>>>
>>> Each occurrence of {a:t@ype+} should be changed to {a:type}. E.g.,
>>>
>>> extern
>>> fun pop {a:t@ype+}(&stack_t(a) >> _) : Option(a) =
>>>   "ext#pop_ats"
>>>
>>> should be changed to
>>>
>>> extern
>>> fun pop {a:type}(&stack_t(a) >> _) : Option(a) = "ext#pop_ats"
>>>
>>> On Sunday, November 17, 2019 at 10:16:11 PM UTC-5, Vanessa McHale wrote:
>>>>
>>>> Hi all,
>>>>
>>>> I am trying to write a concurrent stack. Code is below:
>>>>
>>>> %{
>>>> #include <stdatomic.h>
>>>> #include <stdlib.h>
>>>>
>>>> struct stack_t {
>>>>     void *value;
>>>>     struct stack_t *next;
>>>> };
>>>>
>>>> void __cats_new(struct stack_t *st) {
>>>>     st->value = NULL;
>>>>     st->next = NULL;
>>>> }
>>>>
>>>> void __cats_push(struct stack_t *st, void *val) {
>>>>     for (;;) {
>>>>         struct stack_t old_st = *st;
>>>>         struct stack_t new_st = {val, &old_st};
>>>>         if (atomic_compare_exchange_strong(st, &old_st, new_st))
>>>>             return;
>>>>     }
>>>> }
>>>>
>>>> // ignore ABA problem
>>>> void *__cats_pop(struct stack_t *st) {
>>>>     for (;;) {
>>>>         if (st->next == NULL)
>>>>             return NULL;
>>>>         struct stack_t *old_st = st;
>>>>         struct stack_t xs1 = *(st->next);
>>>>         void *x = st->value;
>>>>         if (atomic_compare_exchange_strong(st, old_st, xs1))
>>>>             return x;
>>>>     }
>>>> }
>>>>
>>>> atstype_boxed pop_ats(atstype_ref st) { return __cats_pop(st); }
>>>>
>>>> atsvoid_t0ype new_ats(atstype_ref st) { __cats_new(st); }
>>>>
>>>> atsvoid_t0ype push_ats(atstype_ref st, atstype_var val) {
>>>>     __cats_push(st, val);
>>>> }
>>>> %}
>>>>
>>>> typedef stack_t(a: t@ype+) = $extype "struct stack_t"
>>>>
>>>> extern
>>>> fun new {a:t@ype+}(&stack_t(a)? >> _) : void =
>>>>   "ext#new_ats"
>>>>
>>>> extern
>>>> fun push {a:t@ype+}(&stack_t(a) >> _, a) : void =
>>>>   "ext#push_ats"
>>>>
>>>> extern
>>>> fun pop {a:t@ype+}(&stack_t(a) >> _) : Option(a) =
>>>>   "ext#pop_ats"
>>>>
>>>> fn print_str(x : string) : void =
>>>>   println!(x)
>>>>
>>>> implement main0 (argc, argv) =
>>>>   let
>>>>     var st: stack_t(string)
>>>>     val () = new(st)
>>>>     val () = push(st, "res")
>>>>     val () = push(st, "res2")
>>>>     val- Some (x) = pop(st)
>>>>     val () = print_str(x)
>>>>   in end
>>>>
>>>> (This compiles with gcc; I can run it with patscc simple.dats -latomic ;
>>>> ./a.out)
>>>>
>>>> Unfortunately, it immediately segfaults. I know that the offending line
>>>> is the
>>>>
>>>> val () = print_str(x)
>>>>
>>>> because removing it makes the program run fine.
>>>>
>>>> I tried writing an equivalent program in C, viz.
>>>>
>>>> #include <stdio.h>
>>>>
>>>> int main(int argc, char *argv[]) {
>>>>
>>>>     struct stack_t *st;
>>>>
>>>>     __cats_push(st, "res");
>>>>     __cats_push(st, "res2");
>>>>
>>>>     char *res;
>>>>
>>>>     res = __cats_pop(st);
>>>>     printf("%s\n", res);
>>>>
>>>>     res = __cats_pop(st);
>>>>     printf("%s\n", res);
>>>> }
>>>>
>>>> ...which works as expected. So I believe I am misunderstanding how ATS
>>>> handles FFI and how structures exist in memory. 
>>>>
>>>> Any insight is appreciated!
>>>>
>>>> Thanks,
>>>> Vanessa
>>>>
>>>> -- 
>> 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-lan...@googlegroups.com <javascript:>.
>> To view this discussion on the web visit 
>> https://groups.google.com/d/msgid/ats-lang-users/2b564e10-e652-47d9-a6b5-61b3b27499d0%40googlegroups.com
>>  
>> <https://groups.google.com/d/msgid/ats-lang-users/2b564e10-e652-47d9-a6b5-61b3b27499d0%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/f534cf03-500a-4df5-9717-b3e0b41a92ae%40googlegroups.com.

Reply via email to