Zsh Mailing List Archive
Messages sorted by:
Reverse Date,
Date,
Thread,
Author
Re: Could someone clarify how math functions work?
- X-seq: zsh-users 19594
- From: Kurtis Rader <krader@xxxxxxxxxxxxx>
- To: Bart Schaefer <schaefer@xxxxxxxxxxxxxxxx>
- Subject: Re: Could someone clarify how math functions work?
- Date: Thu, 18 Dec 2014 21:51:18 -0800
- Cc: Zsh Users <zsh-users@xxxxxxx>
- In-reply-to: <CABx2=D90SO9+hA0O9EK-exz60V2vQAxZGbhNZK-_0H=p_6igyA@mail.gmail.com>
- List-help: <mailto:zsh-users-help@zsh.org>
- List-id: Zsh Users List <zsh-users.zsh.org>
- List-post: <mailto:zsh-users@zsh.org>
- Mailing-list: contact zsh-users-help@xxxxxxx; run by ezmlm
- References: <54939F50.50102@gmx.com> <141218213450.ZM28822@torch.brasslantern.com> <CABx2=D90SO9+hA0O9EK-exz60V2vQAxZGbhNZK-_0H=p_6igyA@mail.gmail.com>
To clarify the "lather, rinse, repeat" part of my reply:
http://en.wikipedia.org/wiki/Lather,_rinse,_repeat
On Thu, Dec 18, 2014 at 9:48 PM, Kurtis Rader <krader@xxxxxxxxxxxxx> wrote:
>
> Your second example is identical to the first so you apparently did what I
> often do: forgot to make a copy of the desired text. That is, your second
> example should be
>
> zsh -c 'add() { for arg; do (( n += arg )); done; print n: $n };
> functions -M add; print results: $(( add(3,1,2) ))'
>
>
> I would argue that your explanation, while correct, illustrates my point.
> Namely, that the subtleties involving the parsing, execution,
> interpolation, lather, rinse, repeat sequence of any Bourne shell
> derivative is inherently problematic.
>
> On Thu, Dec 18, 2014 at 9:34 PM, Bart Schaefer <schaefer@xxxxxxxxxxxxxxxx>
> wrote:
>>
>> On Dec 18, 10:45pm, Eric Cook wrote:
>> } Subject: Could someone clarify how math functions work?
>> }
>> } zsh -c 'add() ( for arg; do (( n += arg )); done; print n: $n );
>> } functions -M add; print results: $(( add(1,2,3) ))'
>> }
>> } Outputs:
>> } n: 6
>> } results: 3
>> }
>> } where as:
>> } zsh -c 'add() { local arg n; for arg; do (( n += arg )); done; print n:
>> } $n }; functions -M add; print results: $(( add(1,2,3) ))'
>> }
>> } Outputs:
>> } n: 6
>> } results: 6
>> }
>> } Is that expected behavior? If so, could you explain why?
>>
>> The following might illustrate:
>>
>> zsh -c 'add() ( for arg; do (( n += arg )); done; print n: $n );
>> functions -M add; print results: $(( add(3,2,1) ))'
>>
>> zsh -c 'add() ( for arg; do (( n += arg )); done; print n: $n );
>> functions -M add; print results: $(( add(3,1,2) ))'
>>
>>
>> When you define add() with parens ( ) around the function body, you
>> are running the function body in a subshell. The "last arithmetical
>> expression evaluated" IN THE CURRENT SHELL is the processing of the
>> argument list of the call to add(), which is done left-to-right and
>> is therefore "3" in the original example.
>>
>> When you define add() with braces { } you are running the function
>> body in in the current shell, so the last expression is the last
>> assignment in the for-loop body.
>>
>
>
> --
> Kurtis Rader
> Caretaker of the exceptional canines Junior and Hank
>
--
Kurtis Rader
Caretaker of the exceptional canines Junior and Hank
Messages sorted by:
Reverse Date,
Date,
Thread,
Author