2010-09-24 26 views
9

Issu d'une formation en Clojure, je suis pris avec le potentiel que ses pré/post conditions offrent comme base pour la conception par contrat:Conception par contrat (s) pour Lisp commun?

;; sqr.clj 

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

(sqr 10) 
;=> 100 

(sqr 0) 
; Assertion error 

Y at-il une capacité pré/post similaire en Common Lisp et/ou une bibliothèque Design by Contract plus complète disponible dans la nature?

Merci

Répondre

8

il est relativement trivial d'écrire une macro qui peut être utilisé comme ceci:

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

pour les CLO fonctions génériques, voir ici. http://www.muc.de/~hoelzl/tools/dbc/dbc-intro.html

BTW, de cette code on peut voir qu'il n'y a aucun échange de code est possible entre CL et Clojure, sans rien réécrire complètement.

+0

C'est précisément la bibliothèque que je cherchais. Je vous remercie. – fogus

1

Vous pouvez affirmer:

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

Je ne sais pas exactement ce que la partie de poste est ment à faire. :)