diff options
-rw-r--r-- | Doc/Zsh/contrib.yo | 9 | ||||
-rw-r--r-- | Functions/Misc/zmathfuncdef | 20 |
2 files changed, 25 insertions, 4 deletions
diff --git a/Doc/Zsh/contrib.yo b/Doc/Zsh/contrib.yo index 7412f810d..620aaea3d 100644 --- a/Doc/Zsh/contrib.yo +++ b/Doc/Zsh/contrib.yo @@ -2371,7 +2371,7 @@ enditem() See the comments in the function for a few extra tips. ) findex(zmathfuncdef) -item(tt(zmathfuncdef) var(mathfunc) [ var(body) ])( +item(tt(zmathfuncdef) [ var(mathfunc) [ var(body) ] ])( A convenient front end to tt(functions -M). With two arguments, define a mathematical function named var(mathfunc) @@ -2383,10 +2383,15 @@ to refer to optional parameters. Note that the forms must be strictly adhered to for the function to calculate the correct number of arguments. The implementation is held in a shell function named tt(zsh_math_func_)var(mathfunc); usually the user will not need -to refer to the shell function directly. +to refer to the shell function directly. Any existing function +of the same name is silently replaced. With one argument, remove the mathematical function var(mathfunc) as well as the shell function implementation. + +With no arguments, list all var(mathfunc) functions in a form +suitable for restoring the definition. +The functions have not necessarily been defined by tt(zmathfuncdef). ) enditem() diff --git a/Functions/Misc/zmathfuncdef b/Functions/Misc/zmathfuncdef index 21d3c249e..e5692e769 100644 --- a/Functions/Misc/zmathfuncdef +++ b/Functions/Misc/zmathfuncdef @@ -5,18 +5,34 @@ emulate -L zsh setopt extendedglob +local -a match mbegin mend line +local func -if (( $# < 1 || $# > 2 )); then - print "Usage: $0 name [body]" >&2 +if (( $# > 2 )); then + print "Usage: $0 [name [body]]" >&2 return 1 fi +zmodload -i zsh/parameter || return 1 + +if (( $# == 0 )); then + functions -M | while read -A line; do + func=${functions[$line[6]]} + if [[ $func = (#b)[[:space:]]#\(\([[:space:]]#(*[^[:space:]])[[:space:]]#\)\) ]]; then + print "zmathfuncdef $line[3] ${(qq)match[1]}" + fi + done + return 0 +fi + local mname=$1 local fname="zsh_math_func_$1" if (( $# == 1 )); then functions +M $mname && unfunction $fname return 0 +elif [[ -n $functions[$fname] ]]; then + functions +M $mname fi integer iarg=0 ioptarg |