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

Re: real time alias?




Is there a way to have aliases work as macros?  For example, can some modification of warn_ () be used to return from the calling function?

On 03/15/2018 04:46 PM, Marc Chantreux wrote:
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

--
Justin M Wozniak



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