mirror of
				git://git.code.sf.net/p/zsh/code
				synced 2025-10-31 06:00:54 +01:00 
			
		
		
		
	
		
			
				
	
	
		
			45 lines
		
	
	
	
		
			977 B
		
	
	
	
		
			Text
		
	
	
	
	
	
			
		
		
	
	
			45 lines
		
	
	
	
		
			977 B
		
	
	
	
		
			Text
		
	
	
	
	
	
| # Define a mathematical function with its definition and smart(ish)
 | |
| # guessing of the number of arguments.  Doesn't overload for different
 | |
| # numbers of arguments, but that could be done.  Type overloading would be
 | |
| # more fraught.
 | |
| 
 | |
| emulate -L zsh
 | |
| setopt extendedglob
 | |
| 
 | |
| if (( $# < 1 || $# > 2 )); then
 | |
|   print "Usage: $0 name [body]" >&2
 | |
|   return 1
 | |
| fi
 | |
| 
 | |
| local mname=$1
 | |
| local fname="zsh_math_func_$1"
 | |
| 
 | |
| if (( $# == 1 )); then
 | |
|   functions +M $mname && unfunction $fname
 | |
|   return 0
 | |
| fi
 | |
| 
 | |
| integer iarg=0 ioptarg
 | |
| local body=$2
 | |
| 
 | |
| # count compulsory arguments
 | |
| while [[ $body = *'$'(\{|)$((iarg+1))(|[^:[:digit:]]*) ]]; do
 | |
|   (( iarg++ ))
 | |
| done
 | |
| 
 | |
| # count optional arguments
 | |
| (( ioptarg = iarg ))
 | |
| while [[ $body = *'${'$((ioptarg+1))':-'* ]]; do
 | |
|   (( ioptarg++ ))
 | |
| done
 | |
| 
 | |
| functions -M $mname $iarg $ioptarg $fname || return 1
 | |
| 
 | |
| {
 | |
|   eval "$fname() { (( $body )) }"
 | |
| } always {
 | |
|   # Remove math function if shell function definition failed.
 | |
|   if (( TRY_BLOCK_ERROR )); then
 | |
|     functions +M $mname
 | |
|   fi
 | |
| }
 |