2010-09-25 7 views
7

Mi método actual: si hay una función que conozco que tiene un error, copio partes de ella en el REPL y la evalúo para ver si el resultado es el esperado. Para configurarlo, tengo que definir los argumentos a la función como entrada ficticia. No consume mucho tiempo, pero sé que hay una manera más eficiente.formas recomendadas para depurar funciones Clojure?

¿Alguna sugerencia?

+4

acaba de encontrar, y aprendido mucho de esta pregunta relacionada: http://stackoverflow.com/questions/2352020/debugging-in-clojure, pero si alguien tiene pensamientos con respecto a mi caso concreto (depuración el resultado de una función (puramente funcional) ¡Yo "aceptaría" tus buenas ideas! Gracias – yayitswei

+0

+1 porque me gustaría saber algo sobre los lenguajes relacionados con Lisp – JAL

+0

Todavía estoy aprendiendo los conceptos básicos, pero si tuviera que pasar a la depuración de un script/módulo real, verificaría un paquete de prueba de unidad: 'clojure.contrib.test-is' es uno; IIRC hay uno o dos más. – intuited

Respuesta

4

¿Esto ayuda macro? Resulta un let en una serie de defs, para que pueda evaluar las subexpresiones:

(defmacro def-let 
    "like let, but binds the expressions globally." 
    [bindings & more] 
    (let [let-expr (macroexpand `(let ~bindings)) 
     names-values (partition 2 (second let-expr)) 
     defs (map #(cons 'def %) names-values)] 
    (concat (list 'do) defs more))) 

he escrito una explicación aquí: http://www.learningclojure.com/2010/09/astonishing-macro-of-narayan-singhal.html

+0

ooh, ¡eso es bastante sorprendente! – yayitswei

1

para los insectos que abarcan varias funciones me gusta la Trace macro para informar de las llamadas y devoluciones de cada función.

1

Escribí una biblioteca de seguimiento que puede mostrarle qué valor devuelve cada elemento.
http://github.com/hozumi/eyewrap

+0

¿Cómo se compara esto con la macro 'dotrace' en' clojure.contrib.trace'? Parecen tener objetivos/funcionalidades similares. – intuited

+0

La diferencia es sutil. dotrace puede rastrear la función especificada profundamente en cada función a la que llama la función objetivo. eyewrap rastrea todos los elementos en la función objetivo y muestra resultados poco profundos. –

1

versión Función de def-let, algún mérito es de here.

(defn def-let [aVec] 
    (if-not (even? (count aVec)) 
    aVec 
    (let [aKey (atom "")  
      counter (atom 0)] 
     (doseq [item aVec] 
     (if (even? @counter) 
      (reset! aKey item)   
      (intern *ns* (symbol @aKey) (eval item))) 
     ; (prn item)  
    (swap! counter inc))))) 

Uso: debe citar el contenido con una cita, p.

(def-let '[a 1 b 2 c (atom 0)]) 
Cuestiones relacionadas