comp.lang.ada
 help / color / mirror / Atom feed
From: "Dmitry A. Kazakov" <mailbox@dmitry-kazakov.de>
Subject: Re: why this construct causes aliasing problem in 2012 with functions allowing In Out?
Date: Wed, 20 Jun 2012 17:14:39 +0200
Date: 2012-06-20T17:14:39+02:00	[thread overview]
Message-ID: <ikgnsser1io8$.1ofpbj9hcpcio.dlg@40tude.net> (raw)
In-Reply-To: 2adb0da6-9b6e-4514-b703-f0a6261ecc5b@googlegroups.com

On Wed, 20 Jun 2012 07:56:12 -0700 (PDT), Adam Beneschan wrote:

> On Wednesday, June 20, 2012 1:24:11 AM UTC-7, Nasser M. Abbasi wrote:
>> looking at http://www.slideshare.net/AdaCore/ada-2012
>> 
>> (typing it myself looking at the screen)
>> 
>> --------------------------
>> function change(x,y : in out integer) return integer is
>>   begin
>>    x := x*2;
>>    y := y*4;
>>    return x+y;
>>   end
>> 
>>   one , two : integer :=1;
>>   begin
>>     two := change(one,two)+ change(one,two);  -->
>> end
>> -----------------------------
>> 
>> They say it will generate
>> 
>> warning: result may differ if evaluated after actual in expression.
>> 
>> I understand that the order of calls in the A()+B() is not defined.
>> i.e. A() can be called first, then B(), or B() first then A().
>> 
>> But the result should still be the same either way. So what
>> is the problem?
> 
> Obviously, it *would* be a problem if you said
> 
>     two := change(one,two) - change(one,two);
> 
> The language is designed to try to minimize order dependencies that could
> produce different results.  Asking it to make special cases for
> commutative operators when both operands are identical expressions, is
> asking too much.

Well, there exist possibilities to address the issue.

Let the language provided means to contract the evaluation order of some
operations.

Arguments having contracted side effects (like change(...) with its in out
parameters) would be illegal for any operation having no contracted
evaluation order, e.g. "-". This would make 
 
   two := change(one,two) + change(one,two)

illegal. But when the order is specified, e.g. left to right for string
"&", then side effects in arguments would be permitted:

   Name : String := Read (Socket) & Read (Socket);

-- 
Regards,
Dmitry A. Kazakov
http://www.dmitry-kazakov.de



  reply	other threads:[~2012-06-20 15:14 UTC|newest]

Thread overview: 6+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2012-06-20  8:24 why this construct causes aliasing problem in 2012 with functions allowing In Out? Nasser M. Abbasi
2012-06-20  8:26 ` Nasser M. Abbasi
2012-06-20 14:56 ` Adam Beneschan
2012-06-20 15:14   ` Dmitry A. Kazakov [this message]
2012-06-21 20:06     ` Randy Brukardt
2012-06-21 20:00   ` Randy Brukardt
replies disabled

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox