15

私がいるプロシージャの名前を知る方法。つまり、これが必要です:

proc nameOfTheProc {} {

    #a lot of code here
    puts "ERROR: You are using 'nameOfTheProc' proc wrongly"
}

「nameOfTheProc」を取得したいのですが、ハードコードは取得したくありません。そのため、誰かが proc 名を変更しても、適切に動作します。

4

3 に答える 3

14

info level問題に対して次のコマンドを使用できます。

proc nameOfTheProc {} {

    #a lot of code here
    puts "ERROR: You are using '[lindex [info level 0] 0]' proc wrongly"
    puts "INFO:  You specified the arguments: '[lrange [info level [info level]] 1 end]'"
}

内側info levelを使用すると、現在のプロシージャ呼び出しの深さのレベルを取得できます。外側のものは、プロシージャ自体の名前を返します。

于 2012-04-04T14:20:47.980 に答える
6

質問で暗示されていることを達成するための正しい慣用的な方法は、次のreturn -code error $messageように使用することです。

proc nameOfTheProc {} {
    #a lot of code here
    return -code error "Wrong sequence of blorbs passed"
}

このようにすると、プロシージャーは、呼び出された内容に満足できない場合にストック Tcl コマンドが行うのとまったく同じように動作します。呼び出しサイトでエラーが発生します。

于 2012-04-04T15:30:03.617 に答える
5

Tcl 8.5 以降を実行している場合、info frameコマンドはリストではなく辞書を返します。したがって、次のようにコードを変更します。

proc nameOfTheProc {} {
   puts "This is [dict get [info frame [info frame]] proc]"
}
于 2012-04-04T14:33:16.010 に答える