A-A+

在TCL中自定义数学函数的方法

2019年07月21日 脚本 阅读 1,363 views 次

在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

个人公众号“数字化设计CAX联盟”,欢迎关注,共同交流
标签:
为您推荐:

给我留言

© 坐倚北风 版权所有 严禁镜像复制 苏ICP备15034888号. 基于 Ality 主题定制 AliCMS
联系邮箱:leanwind@163.con,微信公众号:数字化设计CAX联盟

用户登录

分享到: