2010-09-25 15 views
7

Il mio metodo attuale: se c'è una funzione che conosco ha un bug, ne copio frammenti nel REPL e valuto per vedere se l'output è quello che mi aspetto. Per configurarlo, devo definire gli argomenti come funzione fittizia. Non richiede molto tempo, ma so che c'è un modo più efficiente.Metodi consigliati per il debug delle funzioni Clojure?

Qualche suggerimento?

+4

appena trovato, e imparato molto da questa domanda correlata: http://stackoverflow.com/questions/2352020/debugging-in-clojure, ma se qualcuno ha pensieri per quanto riguarda il mio caso specifico (il debug l'output di una funzione (puramente funzionale) vorrei "accettare" le tue buone idee! Grazie – yayitswei

+0

+1 perché vorrei sapere qualcosa sulle lingue relative al Lisp – JAL

+0

Sto ancora imparando le basi, ma se dovessi fare un salto avanti per eseguire il debug di un vero script/modulo, vorrei verificare un pacchetto di test unitario: 'clojure.contrib.test-is' è uno; IIRC ce ne sono uno o due. – intuited

risposta

4

Fa questa macro di aiuto? Si trasforma un let in una serie di defs, in modo da poter valutare le sottoespressioni:

(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))) 

ho scritto una spiegazione qui: http://www.learningclojure.com/2010/09/astonishing-macro-of-narayan-singhal.html

+0

ooh, è abbastanza sorprendente! – yayitswei

1

per i bug che abbracciano diverse funzioni Mi piace il Trace macro per la segnalazione delle chiamate e restituisce ogni funzione.

1

Ho scritto una libreria di tracciatura in grado di mostrare il valore restituito da ogni elemento.
http://github.com/hozumi/eyewrap

+0

Come si confronta con la macro 'dotrace' in' clojure.contrib.trace'? Sembrano avere obiettivi/funzionalità simili. – intuited

+0

La differenza è sottile. dotrace può tracciare la funzione specificata in profondità in ogni funzione che chiama le chiamate di funzione. eyewrap traccia tutti gli elementi nella funzione target e mostra risultati superficiali. –

1

Versione funzione di def-let, parte del credito va a 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))))) 

Utilizzo: È necessario quotare il contenuto con un preventivo, ad es.

(def-let '[a 1 b 2 c (atom 0)]) 
Problemi correlati