zsh-workers
 help / color / mirror / code / Atom feed
From: Vincent Lefevre <vincent@vinc17.org>
To: Zsh hackers list <zsh-workers@sunsite.dk>
Cc: Richard Hartmann <richih.mailinglist@gmail.com>,
	Peter Stephenson <p.w.stephenson@ntlworld.com>
Subject: Re: arithmetic operator precedence
Date: Tue, 17 Jun 2008 17:49:33 +0200	[thread overview]
Message-ID: <20080617154933.GS10734@prunille.vinc17.org> (raw)
In-Reply-To: <20080617145338.GQ5016@sc.homeunix.net>

On 2008-06-17 15:53:38 +0100, Stephane Chazelas wrote:
> 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.

And that's the most intuitive one I can see. And that's why both bash
and zsh follow this 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_,

No, you said: "POSIX does say that $((a ** 2)) is the same as $(($a ** 2))
because $a contains an integer constant, and that's $((-3**2))."

> it is more likely that it implements it as -3 ** 2 == 9, to avoid
> confusion.

That's your opinion. I'd say it is very unlikely to regard
$((a ** 2)) as $(($a ** 2)) because
  1. It is very confusing (more precisely, the $(($a ** 2)) form is
     confusing as far arithmetic evaluation is concerned, and that's
     probably why the form with variables in arithmetic expressions
     have been added).
  2. Several shells (bash, zsh) do it in another way, and AFAIK,
     no-one has complained on their behavior.

> - 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)

As it does a reference to C expressions, I'd say that it should do
like C. Note that with your interpretation, two passes are necessary
if the shell regards advanced forms of integer constants (such as
"1 + 1"): one to identify the variable names, and one to reparse the
expression after replacing the variable names.

> - 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.

Yes, that's why it's probably a bug (but POSIX doesn't even say
that the shell should be able to re-read the output value).

> - because all existing shell implementations do it that way at
>   the moment.

Only for precedence reasons (probably without much reflection and
because the unnecessary precedence of the unary - over * was already
there), certainly not because $((a ** 2)) and $(($a ** 2)) are
regarded as the same: they are handled differently.

BTW, when using directed rounding modes, this is very confusing in C.

-- 
Vincent Lefèvre <vincent@vinc17.org> - Web: <http://www.vinc17.org/>
100% accessible validated (X)HTML - Blog: <http://www.vinc17.org/blog/>
Work: CR INRIA - computer arithmetic / Arenaire project (LIP, ENS-Lyon)


  reply	other threads:[~2008-06-17 15:49 UTC|newest]

Thread overview: 45+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2008-06-12  9:57 Stephane Chazelas
2008-06-12 13:12 ` Mikael Magnusson
2008-06-12 13:40 ` Peter Stephenson
2008-06-12 14:47   ` Bart Schaefer
2008-06-12 15:01     ` Stephane Chazelas
2008-06-16  8:17       ` Vincent Lefevre
2008-06-16  8:07 ` Vincent Lefevre
2008-06-16 13:42   ` Peter Stephenson
2008-06-16 13:59     ` Stephane Chazelas
2008-06-16 14:33       ` Vincent Lefevre
2008-06-17  9:19     ` Richard Hartmann
2008-06-17  9:45       ` Stephane Chazelas
2008-06-17 10:24         ` Richard Hartmann
2008-06-17 10:24           ` Richard Hartmann
2008-06-17 10:38           ` Stephane Chazelas
2008-06-17 10:43             ` Peter Stephenson
2008-06-17 11:28               ` Vincent Lefevre
2008-06-17 11:46                 ` Peter Stephenson
2008-06-17 12:05                   ` Vincent Lefevre
2008-06-19  9:37                   ` Jun T.
2008-06-19  9:54                     ` Stephane Chazelas
2008-06-19 16:00                       ` Vincent Lefevre
2008-06-19 16:20                         ` Stephane Chazelas
2008-06-19 17:14                           ` Vincent Lefevre
2008-06-19  9:58                     ` Peter Stephenson
2008-06-19 12:29                       ` Richard Hartmann
2008-06-19 16:04                         ` Vincent Lefevre
2008-06-19 16:10                           ` Mikael Magnusson
2008-06-19 16:27                             ` Stephane Chazelas
2008-06-19 17:25                               ` Vincent Lefevre
2008-06-19 17:20                             ` Vincent Lefevre
2008-06-17 10:45             ` Richard Hartmann
2008-06-17 11:38             ` Vincent Lefevre
2008-06-17 11:19         ` Vincent Lefevre
2008-06-17 11:57           ` Stephane Chazelas
2008-06-17 12:35             ` Vincent Lefevre
2008-06-17 12:46               ` Stephane Chazelas
2008-06-17 13:02                 ` Vincent Lefevre
2008-06-17 13:20                   ` Stephane Chazelas
2008-06-17 14:33                     ` Vincent Lefevre
2008-06-17 14:53                       ` Stephane Chazelas
2008-06-17 15:49                         ` Vincent Lefevre [this message]
2008-06-17 14:35                     ` Stephane Chazelas
2008-06-17 15:05                       ` Vincent Lefevre
2008-06-17 10:54       ` Vincent Lefevre

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=20080617154933.GS10734@prunille.vinc17.org \
    --to=vincent@vinc17.org \
    --cc=p.w.stephenson@ntlworld.com \
    --cc=richih.mailinglist@gmail.com \
    --cc=zsh-workers@sunsite.dk \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
Code repositories for project(s) associated with this public inbox

	https://git.vuxu.org/mirror/zsh/

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).