我可以在Tcl中创建一个运算符吗?

时间:2012-10-04 16:13:32

标签: operators tcl

我想在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=

相同

2 个答案:

答案 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这样的东西,它可以随心所欲地解析它的论点