From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: (qmail 17551 invoked by alias); 8 Nov 2015 22:04:09 -0000 Mailing-List: contact zsh-users-help@zsh.org; run by ezmlm Precedence: bulk X-No-Archive: yes List-Id: Zsh Users List List-Post: List-Help: X-Seq: 20938 Received: (qmail 4348 invoked from network); 8 Nov 2015 22:04:08 -0000 X-Spam-Checker-Version: SpamAssassin 3.4.0 (2014-02-07) on f.primenet.com.au X-Spam-Level: X-Spam-Status: No, score=-1.9 required=5.0 tests=BAYES_00 autolearn=ham autolearn_force=no version=3.4.0 X-Authority-Analysis: v=2.1 cv=X+5rdgje c=1 sm=1 tr=0 a=Rb7dudWe+J2gL+/7yVpO1Q==:117 a=Rb7dudWe+J2gL+/7yVpO1Q==:17 a=N659UExz7-8A:10 a=Reaao_RC_jT_k2kNusQA:9 a=pILNOxqGKmIA:10 Message-id: <563FC6D6.90104@eastlink.ca> Date: Sun, 08 Nov 2015 14:04:06 -0800 From: Ray Andrews User-Agent: Mozilla/5.0 (X11; Linux i686; rv:31.0) Gecko/20100101 Icedove/31.7.0 MIME-version: 1.0 To: zsh-users@zsh.org Subject: Re: saved from prince of eval References: <563F8168.5080006@eastlink.ca> <151108115752.ZM859@torch.brasslantern.com> In-reply-to: <151108115752.ZM859@torch.brasslantern.com> Content-type: text/plain; charset=windows-1252; format=flowed Content-transfer-encoding: 7bit On 11/08/2015 11:57 AM, Bart Schaefer wrote: > If you haven't already, you should read through the "Rules" section > under "Parameter Expansion". "man zshexpn" and search for "Rules". Indeed. I've bounced off it several times, it's the thickest of the thick. Yes, I'll bone up and master it. > In particular the last sentence of the #1 rule "Nested Substitution": > > ... Note that, unless the '(P)' > flag is present, the flags and any subscripts apply directly to > the value of the nested substitution; for example, the expan- > sion ${${foo}} behaves exactly the same as ${foo}. > > Then note that (e) isn't applied until nearly the end of the procedure, > at rule #10. > > So in this expression: > > } 1: $ foo="${(e)${array}[${top}, ${bottom}]}" > > First ${array} expands, and then [$[top},${bottom}] applies to that > value -- which isn't an array, it's a string, so the subscripts are > extracting a range of characters from that string. Finally that > substring is re-evaluated (but probably is nothing interesting). Yes, by gum. Running diagnostics, there were several times when what was printed were just a few chars. I didn't even try to make sense of it. > > I have no idea why you want to put yourself in that situation, It seems unavoidable if I'm to use arrays to pass values to functions. foo='\$${IN[list]}[${IN[topE]}, ${IN[bottomE]}]' IN[PAGE]="${(e)$(print -R "${(e)${foo}}")}" ... 'IN' is the array copied by value from whatever array holds the data for the particular window in play. So in the above, I'm setting the contents of the current displayed page to a range from within the entire available data which is stored in the array who's name is held in ' IN[list]' (and which varies depending on the window). It's called like this: set -A IN ${(kv)main} # The window in play has all it's data in the array 'main'. n_list_draw 0 1 In the original, it's done like this: n-list-draw "$(( (NLIST_CURRENT_IDX-1) % page_height + 1 ))" \ "$page_height" "$page_width" 0 1 "$NLIST_TEXT_OFFSET" inner ansi \ "${(@)col_list[NLIST_FROM_WHAT_IDX_LIST_IS_SHOWN, end_idx]}" ... and of course there are all the local values in the function to receive the arguments, and at the end of the function all the changes have to recaptured to specific variables depending on the window. Mine seems simpler, however I'm open to any suggestion. I quite understand that I'm pushing zsh past it's natural comfort zone, but it does seem to be working, it's readable and extendable, but there might be an entirely different and better way of going about it. > You can replace the $(...) with another ${(e)...} to get your third > needed re-evaluation, and you don't need the inermost ${ } around bar: > > foo="${(e)${(e)${(e)bar}}}" Marvelous. It seems a bit of a labor, but it's understandable. Puts me in mind to ask why we can't have the 'expand everything in one go' flag: foo="$(E)bar} > > Again it's pretty ridiculous that you're doing anything like this in > the first place. As above, is there a better way? I confess again that I'm trying to make zsh into C, but I'm getting away with it. Why shouldn't structured programming be available in zsh? > > } $ foo='stranger' > } $ bar='echo howdy $foo' > } $ eval baz=$bar; echo $baz > } zsh: command not found: howdy << Ferkrissakes > > Well, think about it a bit harder. Or better yet, "setopt xtrace" and > watch what is happening. I understand what eval is doing, my point is just that it's hardly the safe thing when all I want to do is set a parameter from another parameter than contains parameters itself. Of course there are times when we want eval, but setting a parameter ain't it. (e) is it. Thanks Bart, a superb explanation as always.