Zsh Mailing List Archive
Messages sorted by:
Reverse Date,
Date,
Thread,
Author
Re: real time alias?
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