これを正確に実装することはできませんが、役立つオプションが 1 つあります。
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
そして、インポート/エクスポートの巨大なジャンボを少し使用すると、この関数をルート名前空間でコマンドとして使用できるようになります。
% 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