我想在Tcl中创建一个新的运算符,运算符我的意思是可以通过以下方式使用的proc:
$a**2
代替pow($a,2)
或者在我的情况下,我想要一个与<=
和>=
相同的运算符,但是对于浮点数,意思是:
proc <f= {a b {epsilon 1e-15} {
if {$a < $b} {return 1}
return [expr abs($a - $b) < $epsilon]
}
但我想用它作为:
if {$a <f= $b} {...
而不是“
if {[<f= $a $b]} {...
和>f=
答案 0 :(得分:7)
你无法完全实现这一点,但有一个选项可能有所帮助。
从Tcl 8.5开始,通过在tcl::mathfunc
namespace中创建命令,可以为expr
迷你语言定义任意函数,观察:< / p>
% set tcl::mathfunc::epsilon 1e-15
1e-15
% proc tcl::mathfunc::feq {a b} {
variable epsilon
expr {abs($a - $b) < $epsilon}
}
% expr { feq(1, 2) }
0
% expr { feq(1, 1) }
1
% expr { feq(1, 1 + 1e-16) }
1
% if {feq(1, 1 + 1e-16)} { puts OK } else { puts FAIL }
OK
有了import/export mumbo-jumbo,你可以高兴地将这个函数作为根命名空间中的命令使用:
% namespace eval tcl::mathfunc { namespace export feq }
% namespace import tcl::mathfunc::feq
% feq 1 1
1
% feq 1 [expr {1 + 1e-10}]
0
% feq 1 [expr {1 + 1e-16}]
1
(或者,您可以在任何方便的命名空间中创建命令,然后将其导入tcl::mathfunc
命名空间。)
不完全是你想要的,但在我看来足够接近。
另请注意,由于8.5 Tcl有一个特殊的命名空间tcl::mathop
,它将所有expr
运算符公开为命令,但您无法以任何方式真正修改此命名空间(但可以使用它的命令。)
答案 1 :(得分:3)
TCL本身是严格的前缀表示法,所以表面上的答案是不可以的......
但是你也可以做一些radical things with unknown,或者你可以实现自己版本的expr这样的东西,它可以随心所欲地解析它的论点