Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Design By Contract LIbrary(ies) for Common Lisp?

Coming from a background in Clojure, I am taken with the potential that its pre-/post-conditions provide as a basis for design by contract:

;; sqr.clj

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

(sqr 10)
;=> 100

(sqr 0)
; Assertion error

Is there a similar pre/post capability in Common Lisp and/or a more comprehensive Design by Contract library available in the wild?

Thank you

like image 631
fogus Avatar asked Sep 24 '10 14:09

fogus


2 Answers

it is relatively trivial to write a macro that can be used like this:

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

For CLOS generic functions, see here: http://www.muc.de/~hoelzl/tools/dbc/dbc-intro.html

Btw., from this code it can be seen that there is zero code exchange is possible between CL and Clojure, without rewriting anything completely.

like image 163
Rainer Joswig Avatar answered Nov 20 '22 10:11

Rainer Joswig


You can assert:

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

Don't know exactly what the post part is ment to do. :)

like image 24
eolo999 Avatar answered Nov 20 '22 10:11

eolo999