2010-09-24 11 views
9

von einem Hintergrund in Clojure kommend, bin ich mit dem Potenzial genommen, dass seine Pre-/Post-Bedingungen für das Design von Vertrag als Grundlage bieten:Nach Vertragsbibliothek (en) für 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 

Gibt es eine ähnliche pre/post-Fähigkeit in Common Lisp und/oder eine umfassendere Design by Contract-Bibliothek in freier Wildbahn verfügbar?

Danke

Antwort

8

es relativ trivial ist ein Makro zu schreiben, die wie folgt verwendet werden kann:

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

Für CLOS generische Funktionen finden Sie hier:. http://www.muc.de/~hoelzl/tools/dbc/dbc-intro.html

Btw, von dieser Code kann man sehen, dass zwischen CL und Clojure kein Codeaustausch möglich ist, ohne etwas komplett neu zu schreiben.

+0

Dies ist genau die Bibliothek, die ich suchte. Vielen Dank. – fogus

1

können Sie behaupten:

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

nicht genau wissen, was der Post Teil zu tun ment ist. :)