在TCL中自定义数学函数的方法
在TCL8.5中,当表达式解析器遇到像sin($x)这样的数学函数时,它会把函数置换为对tcl: : mathfunc命名空间中的一个普通TCL命令的调用。如果数学函数的参数中包含逗号,则由expr处理参数,将各个分开的参数传给函数的实现过程。因此,表达式expr {sin($x+$y)}和下面这个表达式的处理过程是完全一样的。
expr {[tcl:: mathfunc::sin [expr {$x+$y}]]}
而且,表达式expr{atan2($y-0. 3, $X/2)}
也等同于下列表达式。
expr {[tcl:: mathfunc:: atan2 [expr{$y-0.3}] [expr {$x/2}]]}
在TCL中将数学函数映射为命令的机制,使用了关联命名空间引用。如果一个命名空间定义了命令[namespace current]::tcl::mathfunc::sin,在该命名空间的表达式处理中调用sin就会优先指向这个命令而不是Tcl预定义的::tcl::mathfunc::sin.
该功能允许您定义自己的数学函数,只需要在 tcl::mathfunc命名空间中创建新的命令即可。例如,定义一个函数来计算一到多个数字的平均值。
proc tcl::mathfunc::avg {args}{
if{[llength $args]==0){
return -code error "too few arguments to mathfunction\"avg\""
}
set total 0
foreach val $args{
set total [expr ($total + $val)]
}
return [expr {(double($total)/[llength $args]
})
}
expr avg(2,5,1,7)
3.75