Jak można znaleźć lokalizację procedury (funkcji) w TCL. Pod lokalizacją mam na myśli plik źródłowy, w którym jest zadeklarowany.

Próbuję odczytać obcy kod źródłowy i nie mogę znaleźć deklaracji pojedynczej procedury, przykład:

set MSISDNElement [regexp -all -inline {ISDN +[0-9]+} $Command]

if { $MSISDNElement != "" } {
    foreach elm $MSISDNElement {
        set MSISDNValue [list ISDN [getInternationalFormat [lindex $elm 1]]]
    }
}

set EptData [list [lindex $Command 1]]

InitEptData 3
foreach Element $EptData {
    SetEptData [lindex $Element 0] [lindex $Element 1]
}

Dla funkcji InitEptData i SetEptData nie mogę znaleźć żadnej deklaracji. Czy ktoś zaznajomiony z TCL może lepiej wyjaśnić, jak rozwiązać problem, z którym się borykam? Z góry dziękuję!

9
nenito 29 wrzesień 2012, 13:28

2 odpowiedzi

Najlepsza odpowiedź

Nie ma na to ogólnej odpowiedzi, ponieważ Tcl pozwala na deklarowanie procedur w locie, więc mogą one nie mieć rzeczywistego odniesienia do pliku.

Istnieją próby poprawy sytuacji dla proc, które mają plik definiujący, na przykład TIP280, który jest aktualnie dostępny jako info framew ostatnich wersjach 8.5, oraz TIP 86, który jest tylko przedmiotem dyskusji.

Ale jeśli prosty grep nie działa, możesz śledzić moment utworzenia procedury lub polecenia.

Dzieje się tak w różnych miejscach (Tcl OO może dodać jeszcze kilka, nie jestem pewien):

  • Podczas polecenia load, gdy rozszerzenie binarne rejestruje swoje funkcje obsługi poleceń za pomocą Tcl_CreateCommand lub bardziej nowoczesny Tcl_CreateObjCommand.
  • Podczas polecenia source, gdy ładowany jest plik z definicjami proc
  • Podczas uruchamiania samego polecenia proc w celu zdefiniowania nowej procedury

Używając poleceń info commands i namespace children możesz przejść przez całe drzewo przestrzeni nazw, aby uzyskać listę zdefiniowanych poleceń przed i po wykonanym poleceniu. Możesz więc stworzyć opakowanie, które śledzi nowe polecenia. Zobacz http://wiki.tcl.tk/1489, aby uzyskać wskazówki, jak to zrobić.

Lub po prostu użyj debugera, takiego jak RamDebugger http://www.compassis.com/ramdebugger/Intro lub komercyjny debuger ActiveStates.

10
schlenk 29 wrzesień 2012, 15:18

Z powłoki bash używam:

 find . -name "*.tcl" -exec grep -H proc_name_to_find {} \; | grep proc

Spowoduje to znalezienie wszystkich plików tcl, a następnie wykonanie grep na każdym pliku w celu wyszukania proc_name_to_find, a następnie wyjście jest ponownie grepowane dla tych wierszy, które zawierają „proc”

Ponieważ grep -H wypisuje nazwy plików z łańcuchem wyjściowym, to pokazuje wynik, którego potrzebujesz, aby znaleźć definicję w edytorze.

Przykład :

$ find . -name "*.tcl" -exec grep -H set_prime {} \; | grep proc
./my_lib.tcl:proc prime_test::set_prime {{quiet 0} {no_compare 0}} {

Istnieją inne rozwiązania z xargs...

0
user3870893 24 lipiec 2014, 03:32