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

Re: real time alias?



On Thu, Mar 15, 2018 at 10:44:50PM +0100, Marc Chantreux wrote:
> hello,
>
> > > > If a function calls an alias, if the alias changes, the function must be
> > > > resourced, yes?  That makes nothing but sense sincethe alias is what it is
> > > > at sourcing.  An executed script uses the alias in 'real time'.  But, is
> > > > there a way to make a function also use the real time value of an alias?
>
> > Sure, I was just wondering if it was possible at all with an alias.
>
> my advice is: see aliases as macro: don't use it as long as you can
> achieve things with functions. one of the reasons is aliases can be used
> after a variable expansion and so you can get some surprising behaviors.
>
>     rip () {
>         print $1 wrote
>         "$@"
>         print then $1 died
>     }
>     alias stephen='print a brief history of time'
>     rip stephen hawkings
>
> then your universe colapse
>
>     stephen wrote
>     rip:2: command not found: stephen
>     then stephen died
>
> but
>
>     rip () {
>         print $1 wrote
>         "$@"
>         print then $1 died
>     }
>     stephen () print a brief history of time
>     rip stephen hawkings
>
> gives you a good reading advice
>
>     stephen wrote
>     a brief history of time
>     then stephen died
>
> so when are aliases useful? well ... basically when you need something
> like a preprocessor. for example if you have a set of functions where
> the first arguments are always the same, you can write an alias for it:
>
>     alias user_='local ns=${1?namespace of the user expected} \
>     id=${2?the id of the user expected}'
>
>     showid () { user_; print user id is $id }
>     showns () { user_; print user ns is $ns }
>     showid
>
> warns you
>
>     showid: 1: namespace of the user expected
>
> another example from uze.zsh (https://github.com/zsh-uze)
>
>     warn_ () { local r=$?; print -u2 "$*"; return $r }
>     die_  () { local r=$?; print -u2 "$*"; exit   $r }
>     alias warn='warn_ at $0 line $LINENO, warning:'
>     alias ...='{warn unimplemented; return 255}'
>     alias die='die_  died at $0 line $LINENO:'
>
> now i can write
>
>     allowed () false
>
>     do_stuff () {
>         if {allowed} {
>             print i do stuff
>         } else {
>             # what to do then ?
>             ...
>         }
>     }
>
>     do_stuff
>
> so i have this message:
>
>     at do_stuff line 5, warning: unimplemented
>
> hth,
> marc
>
> > you ask, there might be some option or something whereby a function is
> > instructed to grab an alias at runtime sorta the way the value of a variable
> > is grabbed at runtime.
>
> you can use both functions and arrays
>
>     show () {
>         print "hello, i'm a particle and i'm"
>         position
>     }
>     position () print here and there
>     show
>     position () print elsewhere
>     show
>
> gives
>
>     hello, i'm a particle and i'm
>     here and there
>     hello, i'm a particle and i'm
>     elsewhere
>
> also
>
>     show () print -l "hello, i'm a particle and i'm" $position
>     position=( here and there )
>     show
>     position=( elsewhere )
>     show
>
> gives
>
>     hello, i'm a particle and i'm
>     here
>     and
>     there
>     hello, i'm a particle and i'm
>     elsewhere
>
> don't forget that in crontrary of other shells, zsh takes arrays and
> word spliting seriously so you can store a whole command into an array.
> this is lovely when you build one step by step
>
>     academic () true
>     faster   () true
>     dryrun   () true
>
>     dryrun && compiles=( print cc )
>            || compiles=( cc )
>
>     academic && compiles+=( -Wall -std=c99 )
>     faster   && compiles+=( -O2 )
>     compiles+=( $src $dest )
>     $compiles
>
> hth
> marc



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