2012-09-07 14 views
5

Sto convertendo diversi moduli basati su OCaml su F #. Ho il codice convertito e in esecuzione in F #, tuttavia il risultato della funzione finale in F # non è lo stesso del risultato della funzione finale in OCaml. Quindi, ovviamente, devo seguire le chiamate di funzione per capire quale funzione sta restituendo il risultato sbagliato.Conversione da OCaml a F #: Esiste un modo semplice per simulare la #trace di primo livello di OCaml in F #

OCaml ha una buona direttiva di primo livello per tracciare l'input e l'output di una funzione, ad esempio #trace.

Ho cercato i metodi debug e trace di F # e il più vicino possibile è quello di strumentare il codice utilizzando i metodi Trace.Write ma richiede più righe per ogni metodo.

ad es.

originale

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 

fa F # ha la stessa funzionalità OCaml #trace che ho perso durante la ricerca?

Se sei sicuro che la risposta è no, questo è tutto ciò di cui ho bisogno. So che la gente disapprova le risposte brevi, ma questo è tutto ciò di cui ho bisogno se la risposta è no.

EDIT

Per metodi più complessi dove catturare il risultato sarebbe evolvere vasta modifica al codice

originale

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

strumentato

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

012.351.641.061.

PostSharp non supporta F #. Vedi: Using PostSharp with F# - Need documentation with working example

risposta

3

No (anche se mi piacerebbe avere una tale funzione in F #).

5

Non esiste alcuna funzione incorporata per questo in F #, ma credo che sia possibile ottenerlo utilizzando uno strumento di terze parti.

Un approccio potrebbe essere l'utilizzo di PostSharp. Questo è uno strumento per la programmazione orientata all'aspetto (che è uno stile in cui si aggiungono alcune operazioni aggiuntive a determinati metodi). È implementato come un post-processore che prende un assembly compilato e aggiunge alcune operazioni a ciascun metodo. Non sono sicuro che sia stato testato con F #, ma credo che dovrebbe funzionare.

Utilizzando PostSharp, è possibile implementare aspetto che registra le informazioni sulle chiamate di metodo (proprio come il comando #trace in OCaml) e quindi utilizzare una configurazione globale per attaccarlo a tutti i metodi. L'articolo Non-Invasive Tracing & Logging sul loro sito web implementa esattamente questo (e in un modo molto più flessibile e potente).

+0

Sembra interessante. Ho già corretto il mio bug, x% y avrebbe dovuto essere y% x. Lo terrò a mente la prossima volta che colpirò un bug che impiega più di un'ora per trovarlo. –

Problemi correlati