From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: (qmail 19104 invoked from network); 17 Jun 2008 12:36:08 -0000 X-Spam-Checker-Version: SpamAssassin 3.2.4 (2008-01-01) on f.primenet.com.au X-Spam-Level: X-Spam-Status: No, score=-2.6 required=5.0 tests=AWL,BAYES_00 autolearn=ham version=3.2.4 Received: from news.dotsrc.org (HELO a.mx.sunsite.dk) (130.225.247.88) by ns1.primenet.com.au with SMTP; 17 Jun 2008 12:36:08 -0000 Received-SPF: none (ns1.primenet.com.au: domain at sunsite.dk does not designate permitted sender hosts) Received: (qmail 5290 invoked from network); 17 Jun 2008 12:36:04 -0000 Received: from sunsite.dk (130.225.247.90) by a.mx.sunsite.dk with SMTP; 17 Jun 2008 12:36:04 -0000 Received: (qmail 21926 invoked by alias); 17 Jun 2008 12:36:00 -0000 Mailing-List: contact zsh-workers-help@sunsite.dk; run by ezmlm Precedence: bulk X-No-Archive: yes X-Seq: 25186 Received: (qmail 21913 invoked from network); 17 Jun 2008 12:36:00 -0000 Received: from bifrost.dotsrc.org (130.225.254.106) by sunsite.dk with SMTP; 17 Jun 2008 12:36:00 -0000 Received: from prunille.vinc17.org (vinc17.pck.nerim.net [213.41.242.187]) by bifrost.dotsrc.org (Postfix) with ESMTP id 03A8E80525A4 for ; Tue, 17 Jun 2008 14:35:51 +0200 (CEST) Received: by prunille.vinc17.org (Postfix, from userid 501) id 7DC10235035B; Tue, 17 Jun 2008 14:35:51 +0200 (CEST) Date: Tue, 17 Jun 2008 14:35:51 +0200 From: Vincent Lefevre To: Zsh hackers list Cc: Richard Hartmann , Peter Stephenson Subject: Re: arithmetic operator precedence Message-ID: <20080617123551.GJ10734@prunille.vinc17.org> Mail-Followup-To: Zsh hackers list , Richard Hartmann , Peter Stephenson References: <20080612095723.GF5113@sc.homeunix.net> <20080616080726.GP10734@prunille.vinc17.org> <20080616144211.276fb0e3@pws-pc> <2d460de70806170219k12ff4cadn441b52c48bf8076f@mail.gmail.com> <20080617094509.GC5016@sc.homeunix.net> <20080617111934.GE10734@prunille.vinc17.org> <20080617115742.GE5016@sc.homeunix.net> MIME-Version: 1.0 Content-Type: text/plain; charset=iso-8859-1 Content-Disposition: inline Content-Transfer-Encoding: 8bit In-Reply-To: <20080617115742.GE5016@sc.homeunix.net> X-Mailer-Info: http://www.vinc17.org/mutt/ User-Agent: Mutt/1.5.18-vl-r22984 (2008-06-11) X-Virus-Scanned: ClamAV 0.92.1/7494/Tue Jun 17 06:46:03 2008 on bifrost X-Virus-Status: Clean On 2008-06-17 12:57:42 +0100, Stephane Chazelas wrote: > Which makes sense to me. I was serious when I said that -3 ** 2 > was more intuitive to me. Because -3 for me looks like a single > number constant. But it behaves in the same way as - 3, which doesn't look like a single number constant. And in math, when writing -3^2, the -3 isn't a single number constant; said otherwise, you need to take the whole expression into account. BTW, note that in C at least, -3 isn't a single number constant. And this fact is visible in practice, e.g. on a machine with 32-bit int's: #include int main (void) { printf ("%d %d\n", (int) sizeof(-2147483648), (int) sizeof(-2147483647)); return 0; } outputs "8 4", though the value -2147483648 fits in an int (if -2147483648 were regarded as a single number constant, one would have got "4 4"). > BTW, I think I've got a rationale for -3 ** 2 == 9: > > I think POSIX allows $((a * 3)) only as far as $a contains a > constant. If it contains "1 + 1", you won't be guaranteed to > have either 6 or 4. But this rationale doesn't apply if the shell chooses to return 6 (which is IMHO the right extension, and what both bash and zsh do), i.e. you can see $((a * 3)) as equivalent to $(((a) * 3)). Indeed, with this choice, -3**2 == -9 is consistent with: $ a=-3 $ echo $((a ** 2)) 9 > So, if you agree that -3 is an integer constant, and agree that > as POSIX says variable expansion should be performed before the > arithmetic expression is evaluated, so that x=3; echo $(($x * > 2)) is the same as echo $((-3 ** 2)), that'd mean tha But POSIX does not say that variable expansion should be performed before the arithmetic expression (at least in th way you think). If POSIX said so, then with a="1 + 1", $((a * 3)) would give $((1 + 1 * 3)) after variable expansion (without being able to make the difference with $((1 + 1 * 3)) written directly), then 5 after arithmetic expansion. But neither zsh nor bash behaves in that way. > > I think that Perl authors would say something like conventional math > > writing (that's what some of authors of calculators say and what users > > often demand). > [...] > > But I don't write 2**3 in conventional math writing, But there is a direct equivalence (the only ambiguity is where the part in exponent ends, and there's an rule in languages for that). Let's take another example: "-3!" which is conventional math writing. In math, this means -(3!), i.e. -6. As you can see, -3 isn't regarded as a constant. And if a shell (or some other language) wants to support the factorial, it should regard -3! as -(3!). -- Vincent Lefèvre - Web: 100% accessible validated (X)HTML - Blog: Work: CR INRIA - computer arithmetic / Arenaire project (LIP, ENS-Lyon)