-1

Cadence Encounter バージョン 14.25 (または 14.20、ログ ファイルと起動時のスプラッシュ スクリーンのどちらを見るかによって異なります) で実行される Tcl スクリプトを作成しています。

組み込み Tcl インタープリターのバージョンは次のようです。

% package require Tcl
8.5.9

私のスクリプトは、::tcl::mathfunc::min私の理解では、可変数の引数を持つ関数を使用しているため、たとえば、次のように動作するはずです (tclshバージョン 8.6.4 のインストールでは動作します)。

% ::tcl::mathfunc::min 1 2 3
1

ただし、Encounter で実行すると、これは当てはまらず、正確に 2 つの引数に対してのみ機能するようです。

% ::tcl::mathfunc::min 1 
too few arguments for math function "min"
% ::tcl::mathfunc::min 1 2
1
% ::tcl::mathfunc::min 1 2 3
too many arguments for math function "min"

これはなぜですか?

  • Encounter によって報告された Tcl のバージョンは嘘をついていますか?
  • Encounter の Tcl インタプリタは壊れていますか?
  • ::tcl::mathfunc::min8.6 より前の Tcl バージョンでは 2 つの引数しかサポートされていませんか? 私にとって信頼できると思われるすべてのソースは、常に可変数の引数、たとえばthisthis、またはthat を持っていると述べています。

ジャクソンの答えによって引き起こされたさらなる調査:

出会いで:

% info args ::tcl::mathfunc::min
"::tcl::mathfunc::min" isn't a procedure

すごい!...

minグローバル スコープに、動作は同じでエラー メッセージが異なるコマンドがあることを発見しました。

% min 1
wrong # args: should be "min x y"
% min 1 2
1
% min 1 2 3
wrong # args: should be "min x y"

の結果には、2 つの ( ::min, ::tcl::mathfunc::min) のどちらも含まれませんinterp aliases

4

3 に答える 3

1

コマンドを使用する場合

info args ::tcl::mathfunc::min
info body ::tcl::mathfunc::min

組み込みおよび通常の Tcl インタープリターの両方で、min 関数を構成するパラメーターとコードを両方の場所で確認できるはずです。それらが (あなたの調査からそう思われるように) 異なる場合は、別の名前で独自の min 関数を作成するか、my_min と言うか、::tcl::mathfunc:: 名前空間の既存の min 関数を置き換えることができます。注意: Tcl 8.5 以降では、::tcl::mathfunc 名前空間で作成した関数を expr 関数内で使用できます。

于 2015-08-07T08:19:54.833 に答える
1

導入された TIP にはいくつかの興味深い機能があり、Cadence が提供する 2 つの arg バージョンの代わりに::tcl::mathfuncオリジナルを使用するために使用できます。::tcl::mathfunc::min

それは言います:

名前空間は、それらの名前空間の外では見えない独自の数学関数を定義できます。名前空間が関数 [namespace current]::tcl::mathfunc::f を定義する場合、その名前空間で評価される式での f の呼び出しは、::tcl::mathfunc::f より優先してそれに解決されます。この規則は、2 つの拡張機能が衝突することなく関数 f を定義できるようにするだけでなく、拡張機能が sin などの組み込み関数をオーバーライドできるようにもします。」

参照: http://www.tcl.tk/cgi-bin/tct/tip/232.html

したがって、独自のコード内で、独自の名前空間に適切な実装を提供することにより、'min' を通常のものに再定義するだけです。

于 2015-08-12T12:31:55.800 に答える