2012-04-04 3 views
9

Wie man weiß, was der Name des Proc ist, in dem ich bin. Ich meine, ich brauche das:TCL erhalte den proc-Namen, in dem ich bin

proc nameOfTheProc {} { 

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

so möchte ich "NameOfTheProc" aber nicht hard-code erhalten. Wenn jemand den Namen des Procs ändert, funktioniert es immer noch korrekt.

+0

+1 nette Frage, es produzierte viele interessante Antworten. –

Antwort

11

Sie können den info level Befehl für Ihr Problem:

proc nameOfTheProc {} { 

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

Mit den inneren info level werden Sie den Pegel der Prozeduraufruf Tiefe erhalten Sie befinden sich in dem Außen wird man den Namen des Verfahrens zurück. selbst.

+2

'[info level [info level]]' kann als '[info level 0]' ... –

+0

@Donal geschrieben werden: Ja - Sie haben Recht. – bmk

+2

Wenn ja, warum nicht die Antwort bearbeiten? – zehelvion

5

Wenn Ihr Tcl 8.5 oder später ausgeführt wird, gibt der Befehl info frame ein Diktat statt einer Liste zurück. So ändern Sie den Code wie folgt:

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

Das stimmt nicht ganz. 'info level' gibt immer noch eine Liste zurück (mindestens in Version 8.5). Aber 'Info-Frame' gibt ein Diktat zurück. – bmk

+0

@bmk Ihr ganz richtig - Ich habe die Antwort so festgelegt, dass es Info Frame im Text ist. – Jackson

+0

Info-Ebene ist über Argumentlisten, Info-Frame ist über allgemeine Frame-Deskriptoren. Die beiden ergänzen sich. –

5

Der korrekte idiomatische Weg zu erreichen, was ist implizierte in Ihrer Frage return -code error $message wie folgt zu verwenden:

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

Auf diese Weise Ihre Prozedur genau in einem verhaltenen Weg Lager Tcl-Befehle tun, wenn sie nicht mit dem zufrieden sind, mit dem sie aufgerufen wurden: es würde einen Fehler an der Aufruf-Website verursachen.

+0

+1 Ich bin mit @kostix in diesem. –

+0

Das sagt mir nicht, was proc aufgerufen wurde, oder? – Narek

+0

@Narek, Sie sehen dies aus der Stapelüberwachung, die sowohl die Fehlermeldung als auch den Namen der Prozedur enthält, die den Fehler zurückgegeben hat. Wenn Sie diesen Fehler bemerken (dh die Laufzeit nicht erlauben, das Programm zu beenden und den Stack-Trace zu löschen), können Sie die Situation mit den in [return] (http: //www.tcl. tk/man/tcl8.5/TclCmd/return.htm) manuell ('errorInfo' etc). – kostix