2012-02-24 11 views
9

Tengo una pregunta general con respecto a las prácticas de codificación ...¿Cómo rastrear un programa para la depuración en OCaml?

Al depurar, en algún punto de mi código, necesito un código para imprimir el estado actual; Cuando no depuro, no quiero dejar el código allí porque molesta la visibilidad de otro código ...

Es difícil agruparlos en una función porque la mayoría de las veces implica variables locales , y no quiero pasar todo como argumentos ...

Entonces, ¿cómo gestionas generalmente este tipo de código de "impresión/verificación"? ¿hay alguna buena práctica?

Respuesta

5

que a menudo utilizan una función de depuración que imprime valor sólo cuando un indicador de depuración se establece en true:

let debug_flag = ref false 

let debug fmt = 
    if !debug_flag then Printf.eprintf fmt 
    else Printf.ifprintf stderr fmt 
+0

Lo que pasa es que ... lo que quiero imprimir abarca varias líneas e involucra muchas variables locales ... – SoftTimur

+1

El problema con esta función de depuración es que los argumentos siempre se computan, incluso cuando no se usan al final. –

6

que solía tener una función de depuración, que sólo imprimiría la cadena final sólo si una bandera era conjunto. Ahora, prefiero simplemente añadir if declaraciones:

  • que no son mucho más largos
  • nada se calcula es la condición es falsa
  • es fácil mientras lee el código para ver que es sólo para la depuración

también solía tener macros camlp4, que generarían if declaraciones de aplicaciones de función, pero sólo funciona en proyectos donde se utiliza camlp4, que tiendo a evitar hoy en día.

Tenga en cuenta que, generalmente, no utilizo un indicador de depuración, pero muchos indicadores de depuración, uno por módulo y, a continuación, metaetiquetas que desencadenarán la depuración de varios módulos u aspectos ortogonales. Se colocan en una tabla hash como una lista de indicadores, y puedo establecerlos con un argumento o una variable de entorno.

4

Puedo utilizar una extensión de la sintaxis de registro:

http://toss.svn.sourceforge.net/viewvc/toss/trunk/Toss/caml_extensions/pa_log.ml?revision=1679&view=markup

También puede pasar el número de línea a la función de registro (que es un código de difícil AuxIO.log en la fuente más arriba) usando Loc.start_line _loc (tal vez voy agregarlo).

Tenga en cuenta que el condicional debe ser parte de la extensión de sintaxis, de esta manera no calculará los argumentos si no es necesario imprimirlos. Además, tenemos la sintaxis flexible "printf".

También, utiliza un comando en Emacs:

(defun camldev-insert-log-entry() 
    (interactive) 
    (insert "(* {{{ log entry *) 
LOG 2 \"\"; 
(* }}} *)") 
    (goto-char (- (point) 12))) 

junto con `plegado-mode'.

Cuestiones relacionadas