您无法完全实现这一点,但有一个选项可能会有所帮助。
从 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
并且通过一些导入/导出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