zsh-workers
 help / color / mirror / code / Atom feed
From: Stephane Chazelas <stephane@chazelas.org>
To: Bart Schaefer <schaefer@brasslantern.com>
Cc: Zsh hackers list <zsh-workers@zsh.org>
Subject: Re: Up-scope named references, vs. ksh
Date: Mon, 4 Mar 2024 19:59:49 +0000	[thread overview]
Message-ID: <20240304195949.rajtxnltef2stpcx@chazelas.org> (raw)
In-Reply-To: <CAH+w=7ZZrCh23Q3kzJ3K-TtS1ULnWyR-Cpj_ymSvEgejpvtDgw@mail.gmail.com>

2024-03-03 14:58:04 -0800, Bart Schaefer:
[...]
> I've tried several different ways to explain this, so
> I'm just going to ignore this going forward.

Sorry for being so thick but I still don't get it. As there's
still a chance it's just we have different expectations, I'll
try a last attempt at clarifying mine below

[...]
> > Many if not most of the usages of
> > namerefs I've come across were to implement "read"-like commands
> > that return or can return something in a variable whose name is given by the
> > caller (and that can create the variable if needed).
> 
> There's nothing in the current implementation that prevents you from
> doing that if you choose your local names appropriately (and if
> nothing above you in the call chain hasn't already co-opted the name).

If we still have to namespace the names of the nameref variables
and any local variables of functions that use namerefs, then we
might as well do like in bash/mksh and just follow by name.

> > Where an approximation of what I'm suggesting is implemented in
> > zsh seems to work fine (with your patch applied).
> 
> But that approach doesn't work in the general case!  If you move
>   typeset value=$2
> to above the [[ -v $1 ]], then it either bombs, or assigns to the
> "wrong" $value.

To me,

typeset -n ref=var

should tie the ref to the var that is currently in scope at the
time ref is assigned var. If there's none in scope at the
moment, then it should be created unset and undeclared at the
global scope at that point, so that at the next ref=value, it's
that one that is set and not whatever variable with the same
name happened to appear at whatever scope that ref=value was
run.

In:

var=0
f() {
  local var=1
  nameref ref=var
  echo "$var"
}
f

I expect ref to poing to the local var and get "1" because
that's the var that was in scope at the time of ref=var

In:

var=0
f() {
  nameref ref=var
  local var=1
  echo "$var"
}
f

I expect 0.

In

f() {
  nameref ref=var
  local var=1
  echo "${var-unset}"
  ref=2
}
f
echo "$var"

I expect unset and 2
 
[...]
> > I really don't follow, dynamic scoping should make things easier
> > here.
> 
> Consider the case where your function is called 2 or more levels
> removed from the global scope.

In:

var=0
f1() {
  local var=1
  f2
}
f2() {
  f3
  local var=2
}
f3() {
  nameref ref=var
  echo "$ref"
}

I expect to see 1 as that's the var that is in scope at the time of ref=var.

> 
> > but having namerefs that can't create globals seems like a very
> > severe limitations to me
> 
> It's the same limitation as
> () {
>   local foo
>   unset foo
>   () { foo=bar }
> }
> which despite the appearance of the assignment in the nested function,
> doesn't create a global foo, it resurrects the caller's local foo.

Which is very much what I expect and agree it would be very wrong for that to
create a global foo.

> Ksh has static local scope (and an entirely different internal
> representation of parameters) so the local foo makes no difference to
> the nested function.

(unless the local foo is expected or the nest function uses
Bourne-style instead of Korn-style function definition) but yes,
I any case I agree with your description of how scoping would
work in ksh.

-- 
Stephane


  reply	other threads:[~2024-03-04 20:00 UTC|newest]

Thread overview: 48+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2023-02-06  2:21 [PATCH 1/3]: Add named references Bart Schaefer
2023-02-08  3:45 ` Oliver Kiddle
2023-02-08  4:59   ` Bart Schaefer
2023-02-08 23:16     ` Bart Schaefer
2023-02-09  0:47     ` Oliver Kiddle
2023-02-09  2:01       ` Oliver Kiddle
2023-02-09  5:45         ` Bart Schaefer
2023-02-09  4:49       ` Bart Schaefer
2023-02-09 20:49         ` Oliver Kiddle
2023-02-09 23:07           ` Bart Schaefer
2023-02-11  3:04             ` Bart Schaefer
2023-02-11  3:55               ` Bart Schaefer
2023-02-11  5:36                 ` Speaking of dangerous referents Bart Schaefer
2023-02-12  8:00                   ` Oliver Kiddle
2023-02-12  8:34                     ` Bart Schaefer
2023-02-11  7:02               ` [PATCH 1/3]: Add named references Oliver Kiddle
2023-02-11  7:45                 ` Bart Schaefer
2023-02-11 23:43                   ` Bart Schaefer
2023-02-11 23:45                     ` Bart Schaefer
2023-02-12  7:38                     ` Oliver Kiddle
2024-02-11  7:00                   ` Stephane Chazelas
2024-02-11 16:14                     ` Bart Schaefer
2024-02-11 16:42                       ` Bart Schaefer
2024-02-18  3:26                       ` Up-scope named references, vs. ksh Bart Schaefer
2024-02-20 21:05                         ` Stephane Chazelas
2024-02-20 22:30                           ` Bart Schaefer
2024-02-21 20:12                             ` Stephane Chazelas
2024-02-29  5:16                               ` Bart Schaefer
2024-03-01 18:22                                 ` Stephane Chazelas
2024-03-01 20:34                                   ` Bart Schaefer
2024-03-02  7:29                                     ` Bart Schaefer
2024-03-02 23:55                                       ` [PATCH] "typeset -nu" (was Re: Up-scope named references, vs. ksh) Bart Schaefer
2024-03-01 23:28                                   ` Up-scope named references, vs. ksh Bart Schaefer
2024-03-03 13:44                                     ` Stephane Chazelas
2024-03-03 19:04                                       ` Bart Schaefer
2024-03-03 20:27                                         ` Stephane Chazelas
2024-03-03 22:58                                           ` Bart Schaefer
2024-03-04 19:59                                             ` Stephane Chazelas [this message]
2024-03-05  1:05                                             ` Oliver Kiddle
2024-03-05  2:53                                               ` Bart Schaefer
2024-03-05  5:43                                                 ` Mikael Magnusson
2024-03-05  6:30                                                   ` Stephane Chazelas
2024-03-06  5:04                                                     ` [PATCH] local vs. nameref scoping (was Re: Up-scope named references, vs. ksh) Bart Schaefer
2023-02-12  9:02             ` [PATCH 1/3]: Add named references Oliver Kiddle
2023-02-12 18:59               ` Bart Schaefer
2023-02-12 19:45                 ` PM_* flags in zsh.h (was Re: [PATCH 1/3]: Add named references) Bart Schaefer
2023-02-12 21:01                   ` Oliver Kiddle
2023-02-12 22:54                 ` [PATCH 1/3]: Add named references Oliver Kiddle

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=20240304195949.rajtxnltef2stpcx@chazelas.org \
    --to=stephane@chazelas.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).