2012-04-04 10 views
9

Jak się dowiedzieć, jaka jest nazwa proc, w którym jestem. Mam na myśli, że potrzebuję tego:TCL uzyskać nazwę proc, w którym jestem

proc nameOfTheProc {} { 

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

więc chcę uzyskać "nameOfTheProc", ale nie na sztywno. Tak więc, gdy ktoś zmieni nazwę proc, nadal będzie działał poprawnie.

+0

+1 miłe pytanie, wyprodukował wiele ciekawych odpowiedzi. –

Odpowiedz

11

Można użyć komendy info level do problemu:

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]'" 
} 

z wewnętrzną info level dostaniesz poziom głębokości wywołanie procedury jesteś obecnie w Zewnętrzna jeden zwróci nazwę procedury. samo.

+2

'[info level [info level]]' można zapisać jako '[info level 0]' ... –

+0

@Donal: Tak - masz rację. – bmk

+2

Jeśli tak, dlaczego nie edytować odpowiedzi? – zehelvion

5

Jeśli używasz Tcl w wersji 8.5 lub nowszej, komenda info frame zwróci polecenie, a nie listę. Tak zmodyfikować kod w następujący sposób:

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

To nie w pełni prawda. 'info level' nadal zwróci listę (przynajmniej w wersji 8.5). Ale 'ramka informacji' zwraca dict. – bmk

+0

@bmk Słusznie - poprawiłem odpowiedź, aby była ramką informacyjną w tekście. – Jackson

+0

Poziom informacji dotyczy list argumentów, ramka informacji dotyczy ogólnych deskryptorów ramek. Obie uzupełniają się nawzajem. –

5

Prawidłowe idiomatyczne sposobem osiągnięcia co domniemanych w swoim pytaniu jest użycie return -code error $message takiego:

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

ten sposób Państwa procedura będzie zachowywał się dokładnie w sposób sposób, w jaki komendy Tcl działają, gdy nie są zadowoleni z tego, z czym zostały wywołane: spowodowałoby to błąd w witrynie połączenia.

+0

+1 Jestem z @kostix w tym. –

+0

To nie mówi mi, jaki proces został wywołany, prawda? – Narek

+0

@Narek, zobaczysz to ze śladu stosu, który będzie zawierał zarówno komunikat o błędzie, jak i nazwę procedury zwrócił błąd. Jeśli złapiesz ten błąd (tj. Nie pozwolisz środowisku wykonawczemu zakończyć programu i zrzucić ślad stosu), będziesz mógł sprawdzić sytuację za pomocą narzędzi opisanych w ['return'] (http: //www.tcl. tk/man/tcl8.5/TclCmd/return.htm) manual ('errorInfo' itp.). – kostix

Powiązane problemy