2012-09-07 14 views
5

Konwertuję kilka modułów na podstawie OCaml na F #. Mam kod przekonwertowany i działający w F #, jednak wynik ostatniej funkcji w F # nie jest taki sam jak wynik ostatniej funkcji w OCaml. Tak więc oczywiście muszę postępować zgodnie z wywołaniami funkcji, aby dowiedzieć się, która funkcja zwraca nieprawidłowy wynik.Konwertowanie OCaml na F #: Czy istnieje prosty sposób symulacji najwyższego poziomu OCaml #trace w F #

OCaml ma ładną dyrektywę najwyższego poziomu do śledzenia wejścia i wyjścia funkcji, tj. #trace.

Przeszukałem metody F # 's debug i trace, a najbliższe im jest przyuczenie kodu przy użyciu metod Trace.Write, ale dla każdej metody wymaga to kilku linii.

np.

Original

let fun001 parm001 = 
    parm001 * 10 

Instrumented

let fun001 parm001 = 
    // For VS 2010, this trace output will be sent to Output window. 
    System.Diagnostics.Trace.WriteLine("function001 <--");  
    System.Diagnostics.Trace.WriteLine(sprintf "%A" parm001);  
    let result = parm001 * 10 
    System.Diagnostics.Trace.WriteLine("function001 -->"); 
    System.Diagnostics.Trace.WriteLine(sprintf "%A" result); 
    result 

Czy F # mają taką samą funkcjonalność jak OCaml #trace że brakowało podczas wyszukiwania?

Jeśli masz pewność, że odpowiedź brzmi "nie", to wszystko, czego potrzebuję. Wiem, że ludzie marszczą krótkie odpowiedzi, ale to wszystko, czego potrzebuję, jeśli odpowiedź brzmi "nie".

EDIT

Dla bardziej złożonych sposobów przechwytywania gdzie wynik będzie ewoluować znacznych modyfikacji kodu

oryginalny

let func001 parm001 parm002 = 
    match parm001 with 
    | pattern001 -> func002 parm002 
    | head :: tail -> 
     func003 head 
     func001 tail 
    | [] -> failwith "failed" 

oprzyrządowanych

let func001org parm001 parm002 = 
    match parm001 with 
    | pattern001 -> func002 parm002 
    | head :: tail -> 
     func003 head 
     func001 tail 
    | [] -> failwith "failed" 
and fun001 parm001 parm002 = 
    // For VS 2010, this trace output will be sent to Output window. 
    System.Diagnostics.Trace.WriteLine("function001 <--");  
    System.Diagnostics.Trace.WriteLine(sprintf "%A, %A" parm001 parm002);  
    let result = func001org parm001 parm002 
    System.Diagnostics.Trace.WriteLine("function001 -->"); 
    System.Diagnostics.Trace.WriteLine(sprintf "%A" result); 
    result 

EDIT

PostSharp nie obsługuje F #. Zobacz: Using PostSharp with F# - Need documentation with working example

Odpowiedz

3

Nie (chociaż bardzo chciałbym mieć taki obiekt w F #).

5

Nie ma w tym funkcji wbudowanej w F #, ale wierzę, że można to osiągnąć za pomocą narzędzia innej firmy.

Jednym ze sposobów może być użycie PostSharp. Jest to narzędzie do programowania zorientowanego na aspekt (jest to styl, w którym dołączasz jakąś dodatkową operację do niektórych metod). Jest on implementowany jako postprocesor, który pobiera skompilowany zespół i dodaje operację do każdej metody. Nie jestem pewien, czy został przetestowany z F #, ale uważam, że powinien działać.

Korzystanie PostSharp, można zaimplementować aspekt które rejestruje informacje o wywołań metod (tak jak komendy w SML #trace), a następnie skorzystać z konfiguracji globalnej, aby dołączyć go do wszystkich metod. Artykuł Non-Invasive Tracing & Logging na ich stronie internetowej implementuje dokładnie to (i w dużo bardziej elastyczny i potężny sposób).

+0

Wygląda interesująco. Naprawiłem błąd, x% y powinien być y% x. Będę o tym pamiętał, gdy następnym razem trafię na błąd, którego znalezienie zajmie więcej niż godzinę. –