Zsh Mailing List Archive
Messages sorted by: Reverse Date, Date, Thread, Author

Re: PATCH: function copy



On Mon, 2019-07-15 at 14:42 -0700, Bart Schaefer wrote:
> On Mon, Jul 15, 2019 at 1:00 PM Peter Stephenson
> <p.w.stephenson@xxxxxxxxxxxx> wrote:
> > 
> > 
> > I've had this lying around for a while, wondering if there's more to it,
> > but I can't think of it.
> > 
> > The point is that it's very easy internally to provide an interface to
> > tweak standard functions to add arbitrary code before and after --- we
> > have most of the support for this internally, and just lack the means to
> > add a different name for a function, which this adds.
> Emacs calls this "advice" and allows before/around/after variations
> which can be added without having to redefine the existing function.
> I have a half-finished (that may be optimistic) module to provide this
> for ZLE widgets.  Handling the before/after is not too bad, but for
> "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).

That's basically what I showed in my example.

functions -c _std_fn _my_fn
_std_fn() {
  # do stuff here
  _my_fn "$@"
  # do stuff 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.

> The other thing that would be really helpful in order to do it "your
> way" would be local functions, so that when the calling context exits,
> _std_fn reverts to its old definition and _my_fn disappears.  Hacking
> this by making the entire $functions array local is error-prone.

That's another feature that's also quite bug-prone to implement ---
we've had a zillion problems just with local variables which have
been there for ages --- but at least if it's internal it's just
a single implementation.

pws




Messages sorted by: Reverse Date, Date, Thread, Author