zsh-workers
 help / color / mirror / code / Atom feed
From: Bart Schaefer <schaefer@brasslantern.com>
To: Peter Stephenson <p.stephenson@samsung.com>
Cc: "zsh-workers@zsh.org" <zsh-workers@zsh.org>
Subject: Re: PATCH: function copy
Date: Tue, 16 Jul 2019 12:06:17 -0700	[thread overview]
Message-ID: <CAH+w=7YiA6zHgwGPYFFgLng_pjtOZtGc9BHCFAoOZMLmtGFJyA@mail.gmail.com> (raw)
In-Reply-To: <1563267373.6702.5.camel@samsung.com>

On Tue, Jul 16, 2019 at 1:56 AM Peter Stephenson
<p.stephenson@samsung.com> wrote:
>
> On Mon, 2019-07-15 at 14:42 -0700, Bart Schaefer wrote:
>
> > "around" you need a way to say "call the original function HERE" which
> > you can then embed in another function that becomes the "around" (and
> > which is called in place of the original everywhere except HERE).
>
> I think you're implying you'd rather not have an additional function
> name to deal with, i.e. the HERE is indicated in some other fashion.
> That's quite hard to fit into zsh syntax.

There doesn't need to be any special syntax, just some special name
linking, e.g.:

_my_fn() {
  # do stuff here
  _orig_fn "$@"
  # do stuff here
}
advice-around _std_fn _my_fn _orig_fn
advice-around _other_fn _my_fn _orig_fn

and "advice-around" would arrange that any time either _std_fn or
_other_fn was called, the name _orig_fn would temporary be linked to
either _std_fn or _other_fn (as appropriate to whichever one was being
replaced), and then _my_fn would be invoked.  At the end of _my_fn the
temporary name _orig_fn would evaporate.  This allows the same advice
to be linked to multiple functions without having to copy all of them,
etc.

For ordinary functions this is the same as doing something like

_my_fn() {
  local _orig_fn=$1
  shift
  # do stuff here
  $_orig_fn "$@"
  #do stuff here
}
alias _std_fn="_my_fn _std_fn"
alias _other_fn="_my_fn _other_fn"

except you don't have to worry about whether aliases are going to
expand or what order to define them or having the extra argument to
shift off, etc.  For widget functions, though, there's a lot more to
do to be able to invoke a widget properly in the middle of _my_fn,
especially if the original widget is a builtin.

  parent reply	other threads:[~2019-07-16 19:07 UTC|newest]

Thread overview: 11+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2019-07-15 20:00 Peter Stephenson
2019-07-15 20:23 ` Sebastian Gniazdowski
2019-07-15 21:25   ` Peter Stephenson
2019-07-15 21:42 ` Bart Schaefer
2019-07-15 21:51   ` Sebastian Gniazdowski
2019-07-15 22:08     ` Bart Schaefer
2019-07-16  8:56   ` Peter Stephenson
2019-07-16 16:55     ` Philippe Troin
2019-07-16 19:06     ` Bart Schaefer [this message]
2019-07-16 19:11       ` Bart Schaefer
2019-08-03 18:58 ` Peter Stephenson

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='CAH+w=7YiA6zHgwGPYFFgLng_pjtOZtGc9BHCFAoOZMLmtGFJyA@mail.gmail.com' \
    --to=schaefer@brasslantern.com \
    --cc=p.stephenson@samsung.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).