2010-09-24 9 views
9

Venendo da un background in Clojure, mi sono preso con il potenziale che i suoi post-contrattuali/pre forniscono come base per la progettazione per contratto:Design (e) contratto per LIbario (i) per Common Lisp?

;; sqr.clj 

(defn sqr [n] 
    {:pre [(not= 0 n) (number? n)] 
    :post [(pos? %) (number? %)]} 
    (* n n)) 

(sqr 10) 
;=> 100 

(sqr 0) 
; Assertion error 

Esiste una funzionalità simile pre/post in Common Lisp e/o una libreria Design by Contract più completa disponibile in natura?

Grazie

risposta

8

è relativamente banale scrivere una macro che può essere utilizzato in questo modo:

(defun sqr (n) 
    (with-dbc-checked 
    (:pre ((not (zerop n)) (numberp n)) 
     :post ((plusp %) (numberp %))) 
    (* n n))) 

Per CLOS funzioni generiche, vedere qui:. http://www.muc.de/~hoelzl/tools/dbc/dbc-intro.html

Btw, da questa codice si può vedere che è possibile lo scambio di codice zero tra CL e Clojure, senza dover riscrivere completamente nulla.

+0

Questa è esattamente la libreria che stavo cercando. Grazie. – fogus

1

Si può affermare:

(defun sqr (n) 
    (assert (and 
      (not (zerop n)) 
      (numberp n))) 
    (* n n)) 

non sanno esattamente ciò che il post è parte mento di fare. :)