From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: (qmail 25330 invoked from network); 17 Jun 2008 11:58:04 -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 11:58:04 -0000 Received-SPF: none (ns1.primenet.com.au: domain at sunsite.dk does not designate permitted sender hosts) Received: (qmail 79809 invoked from network); 17 Jun 2008 11:58:02 -0000 Received: from sunsite.dk (130.225.247.90) by a.mx.sunsite.dk with SMTP; 17 Jun 2008 11:58:02 -0000 Received: (qmail 27894 invoked by alias); 17 Jun 2008 11:57:59 -0000 Mailing-List: contact zsh-workers-help@sunsite.dk; run by ezmlm Precedence: bulk X-No-Archive: yes X-Seq: 25184 Received: (qmail 27879 invoked from network); 17 Jun 2008 11:57:58 -0000 Received: from bifrost.dotsrc.org (130.225.254.106) by sunsite.dk with SMTP; 17 Jun 2008 11:57:58 -0000 Received: from mail.o2.co.uk (vader.london.02.net [82.132.130.150]) by bifrost.dotsrc.org (Postfix) with ESMTP id 5E4518028AC3 for ; Tue, 17 Jun 2008 13:57:43 +0200 (CEST) Received: from sc.homeunix.net (78.105.216.138) by mail.o2.co.uk (8.0.013.3) (authenticated as stephane.chazelas) id 4851DD9500C4F160; Tue, 17 Jun 2008 12:57:43 +0100 Received: from chazelas by sc.homeunix.net with local (Exim 4.69) (envelope-from ) id 1K8Zok-00022O-MN; Tue, 17 Jun 2008 12:57:42 +0100 Date: Tue, 17 Jun 2008 12:57:42 +0100 From: Stephane Chazelas To: Zsh hackers list , Richard Hartmann , Peter Stephenson Subject: Re: arithmetic operator precedence Message-ID: <20080617115742.GE5016@sc.homeunix.net> 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> MIME-Version: 1.0 Content-Type: text/plain; charset=iso-8859-15 Content-Disposition: inline Content-Transfer-Encoding: 8bit In-Reply-To: <20080617111934.GE10734@prunille.vinc17.org> User-Agent: Mutt/1.5.16 (2007-09-19) X-Virus-Scanned: ClamAV 0.92.1/7494/Tue Jun 17 06:46:03 2008 on bifrost X-Virus-Status: Clean On Tue, Jun 17, 2008 at 01:19:34PM +0200, Vincent Lefevre wrote: > On 2008-06-17 10:45:09 +0100, Stephane Chazelas wrote: > > But ** is not ^, it's a binary operator whose shape reminds that > > of multiply, like a multiply++. > > So, why is ** right-associative while * is left-associative? Don't know. I can't think of a good reason why 2**3**4 shoud be 2**(3**4) rather than (2**3)**4 Or 4 / 4\ 4 3 \3 / rather than / 3\ 2 2 \2 / > > And even then, POSIX's ^ in bc is handled as -3^2 = 9. > > But note that bc is the only calculator with such an unfortunate > choice. And I doubt that bc has been designed by end users. Also, > perhaps those who wrote bc in the first place didn't think about > this problem and just wanted to privilege the precedence of > unary operators as it is often the case. 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. 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. SUSv3> If the shell variable x contains a value that forms a valid SUSv3> integer constant, then the arithmetic expansions "$((x))" and SUSv3> "$(($x))" shall return the same value. 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 x=-3; $((x ** 2)) would either have to expand to -9, or $((-3 ** 2)) should expand to 9. > > It could be a good idea to ask ksh, POSIX/bc and perl authors for > > the rationale behind their choices. > > 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, nor do I write (1+2)/3. I can understand there be different rules, because of the linear, one character right to the previous one contraint of computer strings while we have 2D freedom in hand writing. 1 + 2 ----- 3 has to be translated to (1+2)/3 because of that constraint. -- Stéphane