1

その引数がTcl 8.5以降の辞書であるかどうかにかかわらず、何かを行うprocが必要です。Tcl dict コマンドから簡単なものを見つけることができませんでした。私が動作するコードは次のとおりです。

proc dict? {dicty} { 
    expr { [catch { dict info $dicty } ] ? 0 : 1 }
}

組み込みのキャッチを使用しないものはありますか?
ありがとう。

4

2 に答える 2

3

Tclには、値の実際の型が動的に変化し、それに適用されるコマンドに依存する動的型システムがあるため、あなたのアプローチには欠陥があります。

$ tclsh
% info pa
8.5.11
% dict info {a b}
1 entries in table, 4 buckets
number of buckets with 0 entries: 3
number of buckets with 1 entries: 1
number of buckets with 2 entries: 0
number of buckets with 3 entries: 0
number of buckets with 4 entries: 0
number of buckets with 5 entries: 0
number of buckets with 6 entries: 0
number of buckets with 7 entries: 0
number of buckets with 8 entries: 0
number of buckets with 9 entries: 0
number of buckets with 10 or more entries: 0
average search distance for entry: 1.0
% llength {a b}
2
% string len {a b}
3
% 

ご覧のとおり、同じ値{a b}が辞書、リスト、および文字列です。いずれの場合も、特定の型の値を期待する Tcl コマンドがその「デフォルト」型を変換するまさにその瞬間に、値はその「実際の」型を取得します。文字列である値を、コマンドが操作する値にします。

dict? {a b}{a b}が完全な dict であると同時に完全なリストであり、完全な文字列であるため、呼び出しを試みることはほとんど意味がないことを理解する必要があります。タプル (固定長のリスト) を処理している現在のインタープリター。

したがって、取るべき実際のアプローチはdict、辞書を含むと予想されるコマンドに渡される値に対して、やみくもにコマンドを使用することです。ユーザーが辞書として解釈できないものをコマンドに渡すことができた場合、dictコマンドは失敗します。このようなエラーは実際には回復できないため、これは良いことです (プログラミング エラーです)。

値の特定の型を当てにしようとする試みは、Tcl の暗黙的/動的な型付けのまさにその考えの粒に戻ります。Tcl C API についても同様です。


特定の値のタイプではなく、現在の Tcl バージョンがコマンドをサポートし ていることを確認する方法を本当に知りたい場合はdict、起動時に Tcl のバージョンをテストし、次のようにフラグとして保存します。

set hasDicts [expr {[package vcompare [info tclversion] 8.5] >= 0}]

ただし、値に依存するコードhasDictsはグレーゾーンにあることに注意してください。ユーザーが値を提供していない場合、コマンドで処理するdict場合、それらを処理するためにどのコマンドを使用するのでしょうか?

dictコマンドは、ロード可能なモジュールの形式で Tcl 8.4 インタープリターに追加できることにも注意してください(これを参照)。

于 2015-03-17T12:26:05.960 に答える