From mboxrd@z Thu Jan 1 00:00:00 1970 X-Spam-Checker-Version: SpamAssassin 3.4.4 (2020-01-24) on polar.synack.me X-Spam-Level: X-Spam-Status: No, score=-0.3 required=5.0 tests=BAYES_00, REPLYTO_WITHOUT_TO_CC autolearn=no autolearn_force=no version=3.4.4 X-Google-Thread: 103376,50856407da0f240e X-Google-NewGroupId: yes X-Google-Attributes: gida07f3367d7,domainid0,public,usenet X-Google-Language: ENGLISH,ASCII-7-bit Received: by 10.68.228.227 with SMTP id sl3mr8249981pbc.5.1340205278612; Wed, 20 Jun 2012 08:14:38 -0700 (PDT) Path: l9ni72745pbj.0!nntp.google.com!news2.google.com!goblin2!goblin.stu.neva.ru!news.stack.nl!aioe.org!.POSTED!not-for-mail From: "Dmitry A. Kazakov" Newsgroups: comp.lang.ada Subject: Re: why this construct causes aliasing problem in 2012 with functions allowing In Out? Date: Wed, 20 Jun 2012 17:14:39 +0200 Organization: cbb software GmbH Message-ID: References: <2adb0da6-9b6e-4514-b703-f0a6261ecc5b@googlegroups.com> Reply-To: mailbox@dmitry-kazakov.de NNTP-Posting-Host: FbOMkhMtVLVmu7IwBnt1tw.user.speranza.aioe.org Mime-Version: 1.0 X-Complaints-To: abuse@aioe.org User-Agent: 40tude_Dialog/2.0.15.1 X-Notice: Filtered by postfilter v. 0.8.2 Content-Type: text/plain; charset="us-ascii" Content-Transfer-Encoding: 7bit Date: 2012-06-20T17:14:39+02:00 List-Id: 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