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

SIM*_*MEL 3 tcl operators

我想在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]
}
Run Code Online (Sandbox Code Playgroud)

但我想用它作为:

if {$a <f= $b} {...
Run Code Online (Sandbox Code Playgroud)

代替"

if {[<f= $a $b]} {...
Run Code Online (Sandbox Code Playgroud)

同样的 >f=

kos*_*tix 7

你不能完全实现这一点,但有一个选项可能会有所帮助.

由于Tcl的8.5,它可以定义任意功能expr通过创建小型语言命令tcl::mathfunc命名空间,注意以下几点:

% 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
Run Code Online (Sandbox Code Playgroud)

通过一些导入/导出 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
Run Code Online (Sandbox Code Playgroud)

(或者,您可以在任何方便的命名空间中创建命令,然后将其导入tcl::mathfunc命名空间.)

不完全是你想要的,但在我看来足够接近.

另请注意,由于8.5 Tcl有一个特殊的命名空间tcl::mathop,它将所有expr 操作符公开为命令,但您无法以任何方式真正修改此命名空间(但可以使用它的命令).