From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: (qmail 10861 invoked from network); 17 Jun 2008 14:34:10 -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:34:10 -0000 Received-SPF: none (ns1.primenet.com.au: domain at sunsite.dk does not designate permitted sender hosts) Received: (qmail 61208 invoked from network); 17 Jun 2008 14:34:05 -0000 Received: from sunsite.dk (130.225.247.90) by a.mx.sunsite.dk with SMTP; 17 Jun 2008 14:34:05 -0000 Received: (qmail 27870 invoked by alias); 17 Jun 2008 14:34:02 -0000 Mailing-List: contact zsh-workers-help@sunsite.dk; run by ezmlm Precedence: bulk X-No-Archive: yes X-Seq: 25195 Received: (qmail 27853 invoked from network); 17 Jun 2008 14:34:01 -0000 Received: from bifrost.dotsrc.org (130.225.254.106) by sunsite.dk with SMTP; 17 Jun 2008 14:34:01 -0000 Received: from prunille.vinc17.org (vinc17.pck.nerim.net [213.41.242.187]) by bifrost.dotsrc.org (Postfix) with ESMTP id B24A280525A4 for ; Tue, 17 Jun 2008 16:33:57 +0200 (CEST) Received: by prunille.vinc17.org (Postfix, from userid 501) id 6941F2350A5B; Tue, 17 Jun 2008 16:33:57 +0200 (CEST) Date: Tue, 17 Jun 2008 16:33:57 +0200 From: Vincent Lefevre To: Zsh hackers list Cc: Richard Hartmann , Peter Stephenson Subject: Re: arithmetic operator precedence Message-ID: <20080617143357.GO10734@prunille.vinc17.org> Mail-Followup-To: Zsh hackers list , Richard Hartmann , Peter Stephenson References: <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> <20080617123551.GJ10734@prunille.vinc17.org> <20080617124607.GH5016@sc.homeunix.net> <20080617130246.GL10734@prunille.vinc17.org> <20080617132039.GK5016@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: <20080617132039.GK5016@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 14:20:39 +0100, Stephane Chazelas wrote: > On Tue, Jun 17, 2008 at 03:02:46PM +0200, Vincent Lefevre wrote: > [...] > > It is unspecified. So, the shell is right to choose how it sees it. > > > > > If $a contains an integer constant such as -3, then as per > > > POSIX, $((a * 3)) should be the same as $(($a * 3)), that is > > > $((-3 * 3)). > > > > No, POSIX does not say that. It happens to be the same thing here > > just because of the properties of *, but you can't deduce anything > > for extensions. > > It says $((x)) is meant to be the same as $(($x)) Yes, but not more, and only if x is a valid integer constant. Note that recognizing negative constants is not required by POSIX; so, they are extensions, just like "1+1". BTW, I've just sent a mail to the Austin group about that and other things related to arithmetic expansion. > 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 a recent addition to the text. Only recent versions of > ash (BSD shs) support that for instance, which is why it has > been recommanded for a while to write it $(($x + 1)) instead of > $((x + 1)) in POSIX scripts. And I still use x=$(($x + 1)). But if you want to use extensions and/or more complex expressions, you should add parentheses, e.g. x=$((($x) + 1)). This will also work. > > And in practice, shells don't treat $((a * 3)) and > > $(($a * 3)) in the same way: > > > > vin:~> a="1 + 1" > > vin:~> echo $((a * 3)) > > 6 > > vin:~> echo $(($a * 3)) > > 4 > > But here, $a doesn't contain an integer constant, that's out of > the scope of POSIX. Not completely. The shell may recognize "1 + 1" as an integer constant as an extension, in which case 6 would be the only valid result. Note that negative numbers are in the same case. Also ** is out of the scope of POSIX too. > 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. -- Vincent Lefèvre - Web: 100% accessible validated (X)HTML - Blog: Work: CR INRIA - computer arithmetic / Arenaire project (LIP, ENS-Lyon)