私がいるプロシージャの名前を知る方法。つまり、これが必要です:
proc nameOfTheProc {} {
#a lot of code here
puts "ERROR: You are using 'nameOfTheProc' proc wrongly"
}
「nameOfTheProc」を取得したいのですが、ハードコードは取得したくありません。そのため、誰かが proc 名を変更しても、適切に動作します。
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
を使用すると、現在のプロシージャ呼び出しの深さのレベルを取得できます。外側のものは、プロシージャ自体の名前を返します。
質問で暗示されていることを達成するための正しい慣用的な方法は、次のreturn -code error $message
ように使用することです。
proc nameOfTheProc {} {
#a lot of code here
return -code error "Wrong sequence of blorbs passed"
}
このようにすると、プロシージャーは、呼び出された内容に満足できない場合にストック Tcl コマンドが行うのとまったく同じように動作します。呼び出しサイトでエラーが発生します。
Tcl 8.5 以降を実行している場合、info frame
コマンドはリストではなく辞書を返します。したがって、次のようにコードを変更します。
proc nameOfTheProc {} {
puts "This is [dict get [info frame [info frame]] proc]"
}