9

TCL でプロシージャ (関数) の場所を見つける方法を教えてください。場所の下では、それが宣言されているソースファイルを意味します。

私は外国のソースコードを読み込もうとしていますが、単一のプロシージャの宣言が見つかりません。例:

set MSISDNElement [regexp -all -inline {ISDN +[0-9]+} $Command]

if { $MSISDNElement != "" } {
    foreach elm $MSISDNElement {
        set MSISDNValue [list ISDN [getInternationalFormat [lindex $elm 1]]]
    }
}

set EptData [list [lindex $Command 1]]

InitEptData 3
foreach Element $EptData {
    SetEptData [lindex $Element 0] [lindex $Element 1]
}

関数InitEptDataおよびSetEptDataについて、宣言が見つかりません。私が直面している問題を解決する方法を説明するために、TCLにもっと精通している人がいますか? 前もって感謝します!

4

3 に答える 3

10

Tclではプロシージャをその場で宣言できるため、これに対する一般的な答えはありません。そのため、実際のファイル参照がない可能性があります。

定義ファイルを持つprocの状況を改善するためのいくつかの試みがあります。たとえば、最近の8.5バージョンで実際に利用可能なTIP280や、議論中のTIP86などです。info frame

ただし、単純なgrepものが機能しない場合は、プロシージャまたはコマンドが作成された瞬間を追跡できます。

これはさまざまな場所で発生します(Tcl OOはさらにいくつか追加される可能性がありますが、確かではありません):

  • コマンド中loadに、バイナリ拡張機能がそのコマンドハンドラー関数をTcl_CreateCommandまたはより新しいTcl_CreateObjCommandに登録する場合。
  • sourceproc定義を含むファイルがロードされたときのコマンド中
  • コマンド自体を実行しprocて新しいプロシージャを定義している間

コマンドinfo commandsを使用するとnamespace children、名前空間ツリー全体をたどって、実行されたコマンドの前後に定義されたコマンドのリストを取得できます。したがって、新しいコマンドを追跡するラッパーを作成できます。それを行う方法のヒントについては、http://wiki.tcl.tk/1489を参照してください。

または、RamDebuggerhttp ://www.compassis.com/ramdebugger/IntroなどのデバッガーまたはActiveStates商用デバッガーを使用するだけです。

于 2012-09-29T11:18:20.733 に答える