From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: (qmail 13037 invoked from network); 17 Jun 2008 14:53:53 -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 14:53:53 -0000 Received-SPF: none (ns1.primenet.com.au: domain at sunsite.dk does not designate permitted sender hosts) Received: (qmail 68368 invoked from network); 17 Jun 2008 14:53:49 -0000 Received: from sunsite.dk (130.225.247.90) by a.mx.sunsite.dk with SMTP; 17 Jun 2008 14:53:49 -0000 Received: (qmail 8502 invoked by alias); 17 Jun 2008 14:53:47 -0000 Mailing-List: contact zsh-workers-help@sunsite.dk; run by ezmlm Precedence: bulk X-No-Archive: yes X-Seq: 25198 Received: (qmail 8487 invoked from network); 17 Jun 2008 14:53:47 -0000 Received: from bifrost.dotsrc.org (130.225.254.106) by sunsite.dk with SMTP; 17 Jun 2008 14:53:47 -0000 Received: from mail.o2.co.uk (jabba.london.02.net [82.132.130.169]) by bifrost.dotsrc.org (Postfix) with ESMTP id 2443C8028AC3 for ; Tue, 17 Jun 2008 16:53:39 +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 4851DD9500CBDD07; Tue, 17 Jun 2008 15:53:39 +0100 Received: from chazelas by sc.homeunix.net with local (Exim 4.69) (envelope-from ) id 1K8cZ0-0002aY-Lv; Tue, 17 Jun 2008 15:53:38 +0100 Date: Tue, 17 Jun 2008 15:53:38 +0100 From: Stephane Chazelas To: Zsh hackers list , Richard Hartmann , Peter Stephenson Subject: Re: arithmetic operator precedence Message-ID: <20080617145338.GQ5016@sc.homeunix.net> Mail-Followup-To: Zsh hackers list , Richard Hartmann , Peter Stephenson References: <20080616144211.276fb0e3@pws-pc> <2d460de70806170219k12ff4cadn441b52c48bf8076f@mail.gmail.com> <20080617094509.GC5016@sc.homeunix.net> <20080617111934.GE10734@prunille.vinc17.org> <20080617115742.GE5016@sc.homeunix.net> <20080617123551.GJ10734@prunille.vinc17.org> <20080617124607.GH5016@sc.homeunix.net> <20080617130246.GL10734@prunille.vinc17.org> <20080617132039.GK5016@sc.homeunix.net> <20080617143357.GO10734@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: <20080617143357.GO10734@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 04:33:57PM +0200, Vincent Lefevre wrote: [...] > > which I understand as any occurrance of a variable name (other than > > $-, $?, $0... obviously) in $((...)) should be the same as if the $ > > was not ommited (when $x contains an integer constant). > > No, POSIX doesn't say that. This sentence is a mean to define the > value of x from the contents of $x. But note that parsing has already > been done and you have something like a C expression ("The arithmetic > expression shall be processed according to the rules given in > Arithmetic Precision and Operations"); variables are just replaced > by their values, like in C. Without any extension, both interpretations > are equivalent anyway. That's one interpretation. [...] > Also ** is out of the scope of POSIX too. Yes, as I said I think clearly enough, if POSIX were to specify ** _in a future version of the standard_, it is more likely that it implements it as -3 ** 2 == 9, to avoid confusion. - because it doesn't at the moment clearly state how bare variable names are to be interpreted as you point out (it's true that I was interpreting maybe a bit too much) - because it doesn't clearly state whether -3 is an integer constant or not. ash allows a=-3; echo $((a * 3)) while it doesn't allow a=0-3; echo $((a * 3)) for instance. But then, given that a negative number can be the result of an arithmetic expansion, I can't see how it can be interpreted in any other way than -3 is an integer constant. - because all existing shell implementations do it that way at the moment. > > No, POSIX does say that $((a ** 2)) is the same as $(($a ** 2)) > > because $a contains an integer constant, and that's $((-3**2)). > > No (see above). You are 3 times wrong. POSIX doesn't say anything > about **, POSIX doesn't say that non-trivial expressions $((a ...)) > and $(($a ...)) are equivalent (and in pratice, they aren't), POSIX > doesn't say anything about negative constants (probably a bug, but > the whole section needs to be improved anyway). Perhaps instead of > saying falsehood, you should read the standards. [...] No need to be rude. Now, I think this has probably been discussed enough by now. What is certain is that I will keep writing x=$(($x + 1)) and make sure all the variables I use in arithmetic expansions contain integer constants (negative or not), and if for some obscure reason, I want to write a non-POSIX script meant to be portable to ksh93, bash and zsh, I'll write x=$((($y)**3)) as some shell maintainer might want to follow your advice in the future and change the behavior so that x=$(($y**3)) doesn't work anymore as I would expect it to. I'll stop digressing on this on the list, please feel free to follow up in private if you're keen. -- Stéphane