TCL получает имя proc, в котором я

Как узнать, что такое имя proc, в котором я есть. Я имею в виду, мне нужно это:

proc nameOfTheProc {} {

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

поэтому я хочу получить "nameOfTheProc", но не жесткий код. Чтобы кто-то изменил имя proc, он все равно будет работать правильно.

Ответ 1

Вы можете использовать команду 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 вы получите уровень глубины вызова процедуры, в которой вы находитесь. Внешний будет возвращать имя самой процедуры.

Ответ 2

Правильный идиоматический способ достижения того, что подразумевается в вашем вопросе, заключается в использовании return -code error $message следующим образом:

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

Таким образом, ваша процедура будет вести себя точно так, как это делают команды Tcl, если они не удовлетворены тем, с чем они были вызваны: это вызовет ошибку на сайте вызова.

Ответ 3

Если ваш запуск Tcl 8.5 или более поздней версии, команда info frame вернет dict, а не список. Поэтому измените код следующим образом:

proc nameOfTheProc {} {
   puts "This is [dict get [info frame [info frame]] proc]"
}