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
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.
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. :)
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With