current status of libxatsopt

2021-01-22 Thread Dambaev Alexander
Hi,
I would like to know what is the current status of the libxatsopt.
In particular: is it ready to be used to implement the  language server
protocol support for ATS3?

-- 
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/CAHjn2KyvpYfvLV0NfJSVt%2BbZEBcj8wtrK73Trb9ukdWRMwrmfw%40mail.gmail.com.


Re: Support for OOP in some ATS3 extension (2)

2021-01-22 Thread Dambaev Alexander
I actually missed ATS2->C++ translator: it will be interesting to look at,
thanks!

пт, 22 янв. 2021 г. в 06:58, Hongwei Xi :

> I think I misunderstood your earlier message.
>
> If I understand you correctly this time, then what you mentioned in this
> message
> can already be done in ATS2 (you need ats2cpp for using g++ on the
> generated
> code):
>
> https://github.com/githwxi/ATS-Postiats/tree/master/contrib/ats2cpp
> https://github.com/githwxi/ATS-Postiats/tree/master/contrib/ats2cpp/STL
>
> The code in STL shows a way to wrap linear and dependent types around
> various
> STL functions (stack, deque, etc.).
>
> By the way, this is also what is planned for xats2cc, which aims at
> compiling XATSCML to C/C++.
>
>
> On Thu, Jan 21, 2021 at 5:36 PM Dambaev Alexander 
> wrote:
>
>> And that is why I dream about an ability to be able to render classes to
>> Java/C++: as soon as we might have a XATSCML->Java / XATSCML->C++ translator
>> Ie, to be able to render something like this:
>>
>>
>> ```
>>
>> UCLASS()class AMyActor : public AActor{
>> GENERATED_BODY()public:
>>
>> UPROPERTY(EditAnywhere, BlueprintReadWrite, Category="Damage")
>> int32 TotalDamage;
>>
>> UPROPERTY(EditAnywhere, BlueprintReadWrite, Category="Damage")
>> float DamageTimeInSeconds;
>>
>> UPROPERTY(BlueprintReadOnly, VisibleAnywhere, Transient, 
>> Category="Damage")
>> float DamagePerSecond;
>>
>> ...};
>> ```
>> https://docs.unrealengine.com/en-US/ProgrammingAndScripting/ProgrammingWithCPP/IntroductionToCPP/index.html
>>
>> Such that we should able to inject things like `UCLASS` into output or 
>> `UPROPERTY`.
>>
>> At the same time, this means, that we can have a part of program, that is 
>> written on a C++ and part, which had been rendered to C++ by ATS, such that 
>> to use rendered parts borderlessly, we need to be able to describe 
>> host-languages types in ATS, like:
>> ```
>>
>> typedef std_vector(a:t0ype, n:int) = $extype_struct"std::vector"
>>
>> ```
>>
>> and then we should be able to use, say `push_back` either by using $extfcall 
>> or being able to describe it in statics:
>>
>> ```
>>
>> extern fn {a:t0ype} push_back{n:nat} ( v: !std_vector(a, n) >> std_vector(a, 
>> n+1), value: a): void
>>
>> ```
>>
>> but this means, that ATS should be able to render
>> ```
>>
>>   val vec = (* some constructor *)
>>
>>   val () = push_back( vec, 1)
>>
>> ```
>>
>> into
>> ```
>>
>>std::vector v;
>>
>>v. push_back( 1)
>>
>> ```
>>
>> Otherwise, ATS should render structures into host language and either make 
>> it easy to use from target or we will have to marshall the data between 
>> target language and ATS, but why do we need a translator into a target 
>> language
>> if we still have to spent development time and CPU cycles to marshal data 
>> from/to ATS? :)
>>
>>
>> So what I mean is that there are a lot of 'mainstream' OOP languages, which 
>> are being used for production, say Java and C++ and currently, in order to 
>> write, say, non-C++ for Unreal Engine development, or non C# for Unity3D or
>> non-Java for Android development, you sign for a pain of marshalling data 
>> and writing a lot of bindings (for both sides: target language and higher 
>> level language), ie, loosing the time in fighting against the platform in 
>> pursuit of using
>>  something more, that platform is not able to provide.
>>
>> So for me, it is clear, that ATS2 does the great job to eliminate the 
>> fighting against C to a some extent: ie, ATS requires no marshalling and we 
>> have $extfcall(), so in the case of 'I need to finish this today', we can 
>> use a bunch of $extfcall()s for C libraries and it will
>> not be a fighting against the C target.
>> But, no matter how sad it is, I see a trend, where C API becomes obsolete. 
>> Even GCC is now using C++ as a language of implementation. Many sources say 
>> 'use Golang instead of C for most of your tasks' and C slowly becomes 
>> 'language for kernel API
>> or embedded' development, which means, that very few projects now provide C 
>> libraries, which I can use a an ATS developer. For example: I know, that 
>> only Godot engine provides C library, but neither Unity nor Unreal Engine. 
>> (or maybe I'm wrong?)
>> But if we imagine that someone had developed a translator to C++/Java/C#/Go 
>> - will ATS-developer still be fighting against the platform? I think he will 
>> fight against OOP platforms at least, as it will still require to manually 
>> create classes at least, from which
>>
>> he will be able to call functions, rendered by ATS. And things like 
>> std::vector, std::string and etc may require marshalling to/from ATS, even 
>> if ATS itself renders into a target language...
>>
>>
>>
>> --
>> 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 

Re: Having Trouble Using Call-By-Reference

2021-01-22 Thread d4v3y_5c0n3s
Thank you for the help.  That makes sense, I just wanted to make sure I 
understood the problem for the future.

On Friday, January 22, 2021 at 8:30:07 AM UTC-5 gmhwxi wrote:

> (x:   >> _) means that the argument is call-by-reference; the integer 
> in it may be updated.
>
> BTW, (x: ) means that the argument is read-only call-by-reference, but 
> it is not enforced in ATS2
>
> Note that ( >> _) is just a shorthand for ( >> T).
>
>
>
> On Fri, Jan 22, 2021 at 8:24 AM d4v3y_5c0n3s  wrote:
>
>> Thanks, this works perfectly!  By the way, what does the " >>  _" 
>> syntax mean in this case?
>>
>> On Friday, January 22, 2021 at 1:46:15 AM UTC-5 gmhwxi wrote:
>>
>>> There are a couple of issues. Maybe the following code is what
>>> you wanted:
>>>
>>> fn chng_int_test ( i:  >> _ ) : void = i := i + 1
>>>
>>>
>>> fn test_chnge () : int = let
>>>   var i: int = 0
>>>
>>>   val () = chng_int_test(i)
>>> in
>>>   i
>>> end
>>> On Fri, Jan 22, 2021 at 12:51 AM d4v3y_5c0n3s  wrote:
>>>
 I'm trying to use call by reference in the following example, but I'm 
 running into issues trying to get it to compile.  It's late, so I'll 
 explain more tomorrow, but any help is appreciated.

 fn chng_int_test ( i: ? >> _ ) : void = i + 1

 fn test_chnge () : int = let
 var i = 0
 val () = chng_int_test(i)
 in
 i
 end

 /tmp/patsopt_tcats_SwYDb2: 46(line=2, offs=45) -- 47(line=2, offs=46): 
 error(3): the dynamic expression cannot be assigned the type 
 [S2Eapp(S2Ecst(g1uint_int_t0ype); S2Eextkind(atstype_size), S2EVar(0))].
 /tmp/patsopt_tcats_SwYDb2: 46(line=2, offs=45) -- 47(line=2, offs=46): 
 error(3): mismatch of static terms (tyleq):
 The actual term is: S2Etop(knd=0; S2Eapp(S2Ecst(g0int_t0ype); 
 S2Eextkind(atstype_int)))
 The needed term is: S2Eapp(S2Ecst(g1uint_int_t0ype); 
 S2Eextkind(atstype_size), S2EVar(0))
 /tmp/patsopt_tcats_SwYDb2: 46(line=2, offs=45) -- 51(line=2, offs=50): 
 error(3): the linear dynamic variable [i$view$74(-1)] is preserved but 
 with 
 an incompatible type.
 /tmp/patsopt_tcats_SwYDb2: 46(line=2, offs=45) -- 51(line=2, offs=50): 
 error(3): mismatch of static terms (tyleq):
 The actual term is: S2Etop(knd=0; S2Eapp(S2Ecst(g0int_t0ype); 
 S2Eextkind(atstype_int)))
 The needed term is: S2Eapp(S2Ecst(g0int_t0ype); S2Eextkind(atstype_int))
 /tmp/patsopt_tcats_SwYDb2: 46(line=2, offs=45) -- 51(line=2, offs=50): 
 error(3): mismatch of static terms (tyleq):
 The actual term is: S2Eat(S2Etop(knd=0; S2Eapp(S2Ecst(g0int_t0ype); 
 S2Eextkind(atstype_int))); S2Evar(i(4314)))
 The needed term is: S2Eat(S2Eapp(S2Ecst(g0int_t0ype); 
 S2Eextkind(atstype_int)); S2Evar(i(4314)))
 /tmp/patsopt_tcats_SwYDb2: 46(line=2, offs=45) -- 51(line=2, offs=50): 
 error(3): the dynamic expression cannot be assigned the type 
 [S2Ecst(atsvoid_t0ype)].
 /tmp/patsopt_tcats_SwYDb2: 46(line=2, offs=45) -- 51(line=2, offs=50): 
 error(3): mismatch of static terms (tyleq):
 The actual term is: S2Eapp(S2Ecst(g1uint_int_t0ype); 
 S2Eextkind(atstype_size), S2Eapp(S2Ecst(add_int_int); S2EVar(0), 
 S2Eintinf(1)))
 The needed term is: S2Ecst(atsvoid_t0ype)
 /tmp/patsopt_tcats_SwYDb2: 78(line=4, offs=26) -- 138(line=9, offs=4): 
 error(3): the linear dynamic variable [i$view$75(-1)] is preserved but 
 with 
 an incompatible type.
 /tmp/patsopt_tcats_SwYDb2: 78(line=4, offs=26) -- 138(line=9, offs=4): 
 error(3): mismatch of static terms (tyleq):
 The actual term is: S2Eapp(S2Ecst(g0int_t0ype); S2Eextkind(atstype_int))
 The needed term is: S2Eapp(S2Ecst(g1int_int_t0ype); 
 S2Eextkind(atstype_int), S2Eintinf(0))
 /tmp/patsopt_tcats_SwYDb2: 78(line=4, offs=26) -- 138(line=9, offs=4): 
 error(3): mismatch of static terms (tyleq):
 The actual term is: S2Etop(knd=0; S2Eapp(S2Ecst(g0int_t0ype); 
 S2Eextkind(atstype_int)))
 The needed term is: S2Etop(knd=0; S2Eapp(S2Ecst(g1int_int_t0ype); 
 S2Eextkind(atstype_int), S2Eintinf(0)))
 /tmp/patsopt_tcats_SwYDb2: 78(line=4, offs=26) -- 138(line=9, offs=4): 
 error(3): mismatch of static terms (tyleq):
 The actual term is: S2Eat(S2Etop(knd=0; S2Eapp(S2Ecst(g0int_t0ype); 
 S2Eextkind(atstype_int))); S2Evar(i(4313)))
 The needed term is: S2Eat(S2Etop(knd=0; S2Eapp(S2Ecst(g1int_int_t0ype); 
 S2Eextkind(atstype_int), S2Eintinf(0))); S2Evar(i(4313)))
 patsopt(TRANS3): there are [4] errors in total.
 exit(ATS): uncaught exception: 
 _2home_2hwxi_2Research_2ATS_2dPostiats_2src_2pats_error_2esats__FatalErrorExn(1025)

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

Re: Having Trouble Using Call-By-Reference

2021-01-22 Thread Hongwei Xi
(x:   >> _) means that the argument is call-by-reference; the integer
in it may be updated.

BTW, (x: ) means that the argument is read-only call-by-reference, but
it is not enforced in ATS2

Note that ( >> _) is just a shorthand for ( >> T).



On Fri, Jan 22, 2021 at 8:24 AM d4v3y_5c0n3s  wrote:

> Thanks, this works perfectly!  By the way, what does the " >>  _"
> syntax mean in this case?
>
> On Friday, January 22, 2021 at 1:46:15 AM UTC-5 gmhwxi wrote:
>
>> There are a couple of issues. Maybe the following code is what
>> you wanted:
>>
>> fn chng_int_test ( i:  >> _ ) : void = i := i + 1
>>
>>
>> fn test_chnge () : int = let
>>   var i: int = 0
>>
>>   val () = chng_int_test(i)
>> in
>>   i
>> end
>> On Fri, Jan 22, 2021 at 12:51 AM d4v3y_5c0n3s  wrote:
>>
>>> I'm trying to use call by reference in the following example, but I'm
>>> running into issues trying to get it to compile.  It's late, so I'll
>>> explain more tomorrow, but any help is appreciated.
>>>
>>> fn chng_int_test ( i: ? >> _ ) : void = i + 1
>>>
>>> fn test_chnge () : int = let
>>> var i = 0
>>> val () = chng_int_test(i)
>>> in
>>> i
>>> end
>>>
>>> /tmp/patsopt_tcats_SwYDb2: 46(line=2, offs=45) -- 47(line=2, offs=46):
>>> error(3): the dynamic expression cannot be assigned the type
>>> [S2Eapp(S2Ecst(g1uint_int_t0ype); S2Eextkind(atstype_size), S2EVar(0))].
>>> /tmp/patsopt_tcats_SwYDb2: 46(line=2, offs=45) -- 47(line=2, offs=46):
>>> error(3): mismatch of static terms (tyleq):
>>> The actual term is: S2Etop(knd=0; S2Eapp(S2Ecst(g0int_t0ype);
>>> S2Eextkind(atstype_int)))
>>> The needed term is: S2Eapp(S2Ecst(g1uint_int_t0ype);
>>> S2Eextkind(atstype_size), S2EVar(0))
>>> /tmp/patsopt_tcats_SwYDb2: 46(line=2, offs=45) -- 51(line=2, offs=50):
>>> error(3): the linear dynamic variable [i$view$74(-1)] is preserved but with
>>> an incompatible type.
>>> /tmp/patsopt_tcats_SwYDb2: 46(line=2, offs=45) -- 51(line=2, offs=50):
>>> error(3): mismatch of static terms (tyleq):
>>> The actual term is: S2Etop(knd=0; S2Eapp(S2Ecst(g0int_t0ype);
>>> S2Eextkind(atstype_int)))
>>> The needed term is: S2Eapp(S2Ecst(g0int_t0ype); S2Eextkind(atstype_int))
>>> /tmp/patsopt_tcats_SwYDb2: 46(line=2, offs=45) -- 51(line=2, offs=50):
>>> error(3): mismatch of static terms (tyleq):
>>> The actual term is: S2Eat(S2Etop(knd=0; S2Eapp(S2Ecst(g0int_t0ype);
>>> S2Eextkind(atstype_int))); S2Evar(i(4314)))
>>> The needed term is: S2Eat(S2Eapp(S2Ecst(g0int_t0ype);
>>> S2Eextkind(atstype_int)); S2Evar(i(4314)))
>>> /tmp/patsopt_tcats_SwYDb2: 46(line=2, offs=45) -- 51(line=2, offs=50):
>>> error(3): the dynamic expression cannot be assigned the type
>>> [S2Ecst(atsvoid_t0ype)].
>>> /tmp/patsopt_tcats_SwYDb2: 46(line=2, offs=45) -- 51(line=2, offs=50):
>>> error(3): mismatch of static terms (tyleq):
>>> The actual term is: S2Eapp(S2Ecst(g1uint_int_t0ype);
>>> S2Eextkind(atstype_size), S2Eapp(S2Ecst(add_int_int); S2EVar(0),
>>> S2Eintinf(1)))
>>> The needed term is: S2Ecst(atsvoid_t0ype)
>>> /tmp/patsopt_tcats_SwYDb2: 78(line=4, offs=26) -- 138(line=9, offs=4):
>>> error(3): the linear dynamic variable [i$view$75(-1)] is preserved but with
>>> an incompatible type.
>>> /tmp/patsopt_tcats_SwYDb2: 78(line=4, offs=26) -- 138(line=9, offs=4):
>>> error(3): mismatch of static terms (tyleq):
>>> The actual term is: S2Eapp(S2Ecst(g0int_t0ype); S2Eextkind(atstype_int))
>>> The needed term is: S2Eapp(S2Ecst(g1int_int_t0ype);
>>> S2Eextkind(atstype_int), S2Eintinf(0))
>>> /tmp/patsopt_tcats_SwYDb2: 78(line=4, offs=26) -- 138(line=9, offs=4):
>>> error(3): mismatch of static terms (tyleq):
>>> The actual term is: S2Etop(knd=0; S2Eapp(S2Ecst(g0int_t0ype);
>>> S2Eextkind(atstype_int)))
>>> The needed term is: S2Etop(knd=0; S2Eapp(S2Ecst(g1int_int_t0ype);
>>> S2Eextkind(atstype_int), S2Eintinf(0)))
>>> /tmp/patsopt_tcats_SwYDb2: 78(line=4, offs=26) -- 138(line=9, offs=4):
>>> error(3): mismatch of static terms (tyleq):
>>> The actual term is: S2Eat(S2Etop(knd=0; S2Eapp(S2Ecst(g0int_t0ype);
>>> S2Eextkind(atstype_int))); S2Evar(i(4313)))
>>> The needed term is: S2Eat(S2Etop(knd=0; S2Eapp(S2Ecst(g1int_int_t0ype);
>>> S2Eextkind(atstype_int), S2Eintinf(0))); S2Evar(i(4313)))
>>> patsopt(TRANS3): there are [4] errors in total.
>>> exit(ATS): uncaught exception:
>>> _2home_2hwxi_2Research_2ATS_2dPostiats_2src_2pats_error_2esats__FatalErrorExn(1025)
>>>
>>> --
>>> 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/b7580da8-275c-4d17-b796-90e81404ee5dn%40googlegroups.com
>>> 
>>> .
>>>
>> --
> You received this message because you are subscribed to the Google Groups
> 

Re: Having Trouble Using Call-By-Reference

2021-01-22 Thread d4v3y_5c0n3s
Thanks, this works perfectly!  By the way, what does the " >>  _" 
syntax mean in this case?

On Friday, January 22, 2021 at 1:46:15 AM UTC-5 gmhwxi wrote:

> There are a couple of issues. Maybe the following code is what
> you wanted:
>
> fn chng_int_test ( i:  >> _ ) : void = i := i + 1
>
>
> fn test_chnge () : int = let
>   var i: int = 0
>
>   val () = chng_int_test(i)
> in
>   i
> end
> On Fri, Jan 22, 2021 at 12:51 AM d4v3y_5c0n3s  wrote:
>
>> I'm trying to use call by reference in the following example, but I'm 
>> running into issues trying to get it to compile.  It's late, so I'll 
>> explain more tomorrow, but any help is appreciated.
>>
>> fn chng_int_test ( i: ? >> _ ) : void = i + 1
>>
>> fn test_chnge () : int = let
>> var i = 0
>> val () = chng_int_test(i)
>> in
>> i
>> end
>>
>> /tmp/patsopt_tcats_SwYDb2: 46(line=2, offs=45) -- 47(line=2, offs=46): 
>> error(3): the dynamic expression cannot be assigned the type 
>> [S2Eapp(S2Ecst(g1uint_int_t0ype); S2Eextkind(atstype_size), S2EVar(0))].
>> /tmp/patsopt_tcats_SwYDb2: 46(line=2, offs=45) -- 47(line=2, offs=46): 
>> error(3): mismatch of static terms (tyleq):
>> The actual term is: S2Etop(knd=0; S2Eapp(S2Ecst(g0int_t0ype); 
>> S2Eextkind(atstype_int)))
>> The needed term is: S2Eapp(S2Ecst(g1uint_int_t0ype); 
>> S2Eextkind(atstype_size), S2EVar(0))
>> /tmp/patsopt_tcats_SwYDb2: 46(line=2, offs=45) -- 51(line=2, offs=50): 
>> error(3): the linear dynamic variable [i$view$74(-1)] is preserved but with 
>> an incompatible type.
>> /tmp/patsopt_tcats_SwYDb2: 46(line=2, offs=45) -- 51(line=2, offs=50): 
>> error(3): mismatch of static terms (tyleq):
>> The actual term is: S2Etop(knd=0; S2Eapp(S2Ecst(g0int_t0ype); 
>> S2Eextkind(atstype_int)))
>> The needed term is: S2Eapp(S2Ecst(g0int_t0ype); S2Eextkind(atstype_int))
>> /tmp/patsopt_tcats_SwYDb2: 46(line=2, offs=45) -- 51(line=2, offs=50): 
>> error(3): mismatch of static terms (tyleq):
>> The actual term is: S2Eat(S2Etop(knd=0; S2Eapp(S2Ecst(g0int_t0ype); 
>> S2Eextkind(atstype_int))); S2Evar(i(4314)))
>> The needed term is: S2Eat(S2Eapp(S2Ecst(g0int_t0ype); 
>> S2Eextkind(atstype_int)); S2Evar(i(4314)))
>> /tmp/patsopt_tcats_SwYDb2: 46(line=2, offs=45) -- 51(line=2, offs=50): 
>> error(3): the dynamic expression cannot be assigned the type 
>> [S2Ecst(atsvoid_t0ype)].
>> /tmp/patsopt_tcats_SwYDb2: 46(line=2, offs=45) -- 51(line=2, offs=50): 
>> error(3): mismatch of static terms (tyleq):
>> The actual term is: S2Eapp(S2Ecst(g1uint_int_t0ype); 
>> S2Eextkind(atstype_size), S2Eapp(S2Ecst(add_int_int); S2EVar(0), 
>> S2Eintinf(1)))
>> The needed term is: S2Ecst(atsvoid_t0ype)
>> /tmp/patsopt_tcats_SwYDb2: 78(line=4, offs=26) -- 138(line=9, offs=4): 
>> error(3): the linear dynamic variable [i$view$75(-1)] is preserved but with 
>> an incompatible type.
>> /tmp/patsopt_tcats_SwYDb2: 78(line=4, offs=26) -- 138(line=9, offs=4): 
>> error(3): mismatch of static terms (tyleq):
>> The actual term is: S2Eapp(S2Ecst(g0int_t0ype); S2Eextkind(atstype_int))
>> The needed term is: S2Eapp(S2Ecst(g1int_int_t0ype); 
>> S2Eextkind(atstype_int), S2Eintinf(0))
>> /tmp/patsopt_tcats_SwYDb2: 78(line=4, offs=26) -- 138(line=9, offs=4): 
>> error(3): mismatch of static terms (tyleq):
>> The actual term is: S2Etop(knd=0; S2Eapp(S2Ecst(g0int_t0ype); 
>> S2Eextkind(atstype_int)))
>> The needed term is: S2Etop(knd=0; S2Eapp(S2Ecst(g1int_int_t0ype); 
>> S2Eextkind(atstype_int), S2Eintinf(0)))
>> /tmp/patsopt_tcats_SwYDb2: 78(line=4, offs=26) -- 138(line=9, offs=4): 
>> error(3): mismatch of static terms (tyleq):
>> The actual term is: S2Eat(S2Etop(knd=0; S2Eapp(S2Ecst(g0int_t0ype); 
>> S2Eextkind(atstype_int))); S2Evar(i(4313)))
>> The needed term is: S2Eat(S2Etop(knd=0; S2Eapp(S2Ecst(g1int_int_t0ype); 
>> S2Eextkind(atstype_int), S2Eintinf(0))); S2Evar(i(4313)))
>> patsopt(TRANS3): there are [4] errors in total.
>> exit(ATS): uncaught exception: 
>> _2home_2hwxi_2Research_2ATS_2dPostiats_2src_2pats_error_2esats__FatalErrorExn(1025)
>>
>> -- 
>> 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/b7580da8-275c-4d17-b796-90e81404ee5dn%40googlegroups.com
>>  
>> 
>> .
>>
>

-- 
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/67c75864-2a19-4035-8c9d-33e66ca1797fn%40googlegroups.com.