3

Tcl で新しいオペレーターを作成したいのですが、オペレーターとは、次の方法で使用できる proc を意味します。

$a**2それ以外のpow($a,2)

または、私の場合、浮動小数点数に対して<=and と同じことを行う演算子が必要です。つまり、次のことを意味します。>=

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=

4

2 に答える 2

7

これを正確に実装することはできませんが、役立つオプションが 1 つあります。

Tcl 8.5 以降、名前空間でコマンドを作成することにより、ミニ言語の任意の関数を定義することが可能になりました。exprtcl::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

于 2012-10-04T17:26:15.303 に答える
3

TCL自体は厳密にプレフィックス表記なので、表面的な答えはノーです...

ただし、unknown を使用して根本的なことを行うこともできます。また、好きなように引数を解析できるexprのような独自のバージョンを実装することもできます。

于 2012-10-04T16:21:09.817 に答える