2012-09-07 16 views
5

Estoy convirtiendo varios módulos basados ​​en OCaml a F #. Tengo el código convertido y ejecutándose en F #, sin embargo, el resultado de la función final en F # no es el mismo que el resultado de la función final en OCaml. Así que, obviamente, tengo que seguir las llamadas de función para averiguar qué función devuelve el resultado incorrecto.Convirtiendo OCaml a F #: ¿Hay una manera simple de simular OCaml top-level #trace en F #

OCaml tiene una buena directiva de nivel superior para rastrear la entrada y la salida de una función, es decir, #trace.

He buscado los métodos debug y trace de F # y lo más cerca que me sale es utilizar el código usando los métodos Trace.Write, pero se necesitan varias líneas para cada método.

p. Ej.

original

let fun001 parm001 = 
    parm001 * 10 

instrumentado

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 

Acción f # tiene la misma funcionalidad que OCaml #trace que echaba de menos cuando se busca?

Si está seguro de que la respuesta es no, eso es todo lo que necesito. Sé que la gente frunce el ceño ante las respuestas cortas, pero eso es todo lo que necesito si la respuesta es no.

EDITAR

de métodos más complejos en los que la captura el resultado se desarrollaría una amplia modificación al código

original

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

instrumentada

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 

EDITAR

PostSharp no es compatible con F #. Ver: Using PostSharp with F# - Need documentation with working example

Respuesta

3

No (aunque me gustaría tener una instalación así en F #).

5

No existe una característica incorporada para esto en F #, pero creo que puede lograrlo con una herramienta de terceros.

Un enfoque podría ser usar PostSharp. Esta es una herramienta para la programación orientada a aspectos (que es un estilo donde se adjunta alguna operación adicional a ciertos métodos). Se implementa como un postprocesador que toma un ensamblado compilado y agrega alguna operación a cada método. No estoy seguro si ha sido probado con F #, pero creo que debería funcionar.

Usando PostSharp, puede implementar aspecto que registra información acerca de las llamadas de método (al igual que el comando #trace en OCaml) y luego usar una configuración global para adjuntarlo a todos los métodos. El artículo Non-Invasive Tracing & Logging en su sitio web implementa exactamente esto (y de una manera mucho más flexible y potente).

+0

Parece interesante. Ya arreglé mi error, x% y debería haber sido y% x. Lo tendré en cuenta la próxima vez que pegue un error que tarda más de una hora en encontrar. –