2010-09-24 6 views
9

Viniendo de un fondo de Clojure, me toman con el potencial de que sus pre-post-condiciones/proporcionan como base para el diseño por contrato:Design By Contract LIbrary (s) para 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 

¿Existe una capacidad similar en el pre/post en Common Lisp y/o una biblioteca más completa de Diseño por contrato disponible en la naturaleza?

Gracias

Respuesta

8

es relativamente trivial para escribir una macro que se puede utilizar de esta manera:

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

Para CLOS funciones genéricas, ver aquí:. http://www.muc.de/~hoelzl/tools/dbc/dbc-intro.html

Por cierto, desde este código se puede ver que no hay intercambio de código posible entre CL y Clojure, sin reescribir nada completamente.

+0

Esta es precisamente la biblioteca que estaba buscando. Gracias. – fogus

1

Puede afirmarse:

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

no saben exactamente cuál es la parte posterior es ment hacer. :)