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

Re: Tag functions with shell options?



On Jul 2,  8:53pm, Anthony Heading wrote:
} Subject: Re: Tag functions with shell options?
}
} The lack of context was sort-of deliberate, since I
} suspected any interest would be in the wider picture, rather than my
} particular petty problems.  It seemed simply an example of something
} it would be nice to support elegantly.

This introduces a whole class of problems, which is most obvious in the
case when you *do not* know the names of the functions that should have
their local options (or whatever) changed.  In that case you almost end
up needing something like Perl's "package", so that you can do e.g.:

    package admin
    . /etc/profile
    for f in $(whence -FP admin)
    do
	typeset -fo ${f}=(shwordsplit globassign bsdecho nobgnice);;
    done

Where I'm assuming a slew of new features:
1.  `package foo' groups all functions, aliases, etc. in the package
    named `foo' until the next `package' is executed
2.  `whence -F' lists the names (but NOT definitions) of functions
    [Aside:  Why doesn't `typeset +f' do that already?]
3.  `whence -P foo' lists from the package `foo'
4.  `typeset -o' is equivalent to `setopt' (and `+o' to `unsetopt')
5.  `typeset -fo foo=(options...)' sets local options for `foo', as
    if `foo' began with `setopt localoptions options...'
6.  Zoltan's (or was it Zefram's?) change to make `setopt nofoo' be
    equivalent to `unsetopt foo'

} > it seems to me that a much simpler implementation of sws_fn is:
} [wrapping the function, and then aliasing the wrapper to the original]
} 
} > The only drawback to this is that other functions that may already have
} > been defined won't see the alias -- but presumably those functions will
} > themselves be given the sws_fn treatment, so it's moot.
} 
} Hmm. Don't understand the first point, but I'll experiment.

Example:

    yfn () {
	echo Y
    }
    zfn () {
	echo Z
    }

    xfn1 () {
	yfn
    }

    alias yfn=zfn

    xfn2 () {
	yfn
    }

Now:

    zsh% xfn1
    Y
    zsh% xfn2
    Z

Because the alias for yfn was introduced *after* xfn1 was defined, xfn1
still references the "real" yfn, rather than the alias.  The presumption
is that if you're going to use

    sws_fn yfn

Then you are also going to use

    sws_fn xfn1
    sws_fn xfn2

So that it doesn't matter what "yfn" means inside of xfn*.

-- 
Bart Schaefer                             Brass Lantern Enterprises
http://www.well.com/user/barts            http://www.nbn.com/people/lantern

New male in /home/schaefer:
>N  2 Justin William Schaefer  Sat May 11 03:43  53/4040  "Happy Birthday"




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