zsh-workers
 help / color / mirror / code / Atom feed
From: "Daniel Shahaf" <d.s@daniel.shahaf.name>
To: "Bart Schaefer" <schaefer@brasslantern.com>
Cc: "Nikolaus Thiel" <klt@fsfe.org>,
	"zsh-workers@zsh.org" <zsh-workers@zsh.org>
Subject: Re: zmathfunc: min, max, sum throw error if result equals 0
Date: Sun, 07 Mar 2021 21:56:51 +0000	[thread overview]
Message-ID: <ee7c107d-8bfb-4063-85e8-a7638ae0f951@www.fastmail.com> (raw)
In-Reply-To: <CAH+w=7bPz5u9-mQPbmPmbo=8Cz8em7JmbSn-sp8eZzuvFW3mnQ@mail.gmail.com>

Bart Schaefer wrote on Sun, 07 Mar 2021 21:39 +00:00:
> On Sun, Mar 7, 2021 at 9:17 AM Daniel Shahaf <d.s@daniel.shahaf.name> wrote:
> >
> > Nikolaus Thiel wrote on Sun, Mar 07, 2021 at 17:37:09 +0100:
> > >
> > > When the result of min, max or sum equals 0, the functions throw an error.
> 
> I would not equate "return nozero" with "throw an error", FWIW.
> 
> > Ouch.  Patch series attached.
> 
> I think your regression tests cover this, but use of "true" avoids
> changing the result in "functions -M" context, correct?

Yeah.  «return 0» causes the arithmetic expression to evaluate to 0,
because the argument to «return» is math-evaluated.

> Is it worth testing invalid cases?  Such as uses outside math context
> where the arguments are not syntax checked?

I'd say this specific example of an invalid case is lower priority,
since there's no promise of any particular failure mode.  We could add
a test to ensure it doesn't format C:, of course.

A test for min() and max() with zero arguments would make sense, since
those cases actually do promise a specific failure mode.

Could also add tests with three arguments in various permutations.

If you have ideas, feel free to write them and post them; I'll
transplant them into Z02 once I have committed it.

> As long as we're on the subject:
> 
> zsh_math_func_min() {
>   local result=$1
>   shift
>   local arg
>   for arg ; do
>     (( $arg < result )) && result=$arg
>   done
>   (( result ))
>   true # Careful here: `return 0` evaluates an arithmetic expression
> }
> 
> Because of the way math context works, if any of $@ is a string that
> can be interpreted as a math expression, the above will evaluate it at
> least twice (and up to $# times in the case of $1).  This could have
> side-effects.

Could you post a regression test for this?

Related to code as it is in master, are «(( $arg < result ))» and
«(( arg < result ))» equivalent?

> zsh_math_func_min() {
>   local result=$(( $1 ))

Doesn't this still do multiple string-to-number conversions?

>   shift
>   local arg n
>   for arg ; do
>     (( n = arg )) # evaluate arg exactly once
>     (( n < result && (result = n) ))
>   done
>   (( result ))
>   true # Careful here: `return 0` evaluates an arithmetic expression
> }

Hmm.  I'll go ahead and push the series now, then, so it'll be easier
for you to work on revisions.  If anyone has commit reviews, don't let
the fact that I've pushed things affect you.

Cheers,

Daniel


  reply	other threads:[~2021-03-07 21:57 UTC|newest]

Thread overview: 13+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2021-03-07 16:37 Nikolaus Thiel
2021-03-07 17:17 ` Daniel Shahaf
2021-03-07 21:39   ` Bart Schaefer
2021-03-07 21:56     ` Daniel Shahaf [this message]
2021-03-08  2:25       ` Bart Schaefer
2021-04-16 18:26         ` Daniel Shahaf
2021-04-16 18:47           ` Bart Schaefer
2021-04-16 19:50         ` Daniel Shahaf
2021-04-16 20:05           ` Bart Schaefer
2021-04-16 20:08             ` Daniel Shahaf
2021-04-16 18:21   ` Daniel Shahaf
2021-05-16 14:54     ` Lawrence Velázquez
2021-05-18  2:02       ` Daniel Shahaf

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=ee7c107d-8bfb-4063-85e8-a7638ae0f951@www.fastmail.com \
    --to=d.s@daniel.shahaf.name \
    --cc=klt@fsfe.org \
    --cc=schaefer@brasslantern.com \
    --cc=zsh-workers@zsh.org \
    /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).