开发者

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 comprehensiv开发者_如何学Goe 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. :)

0

上一篇:

下一篇:

精彩评论

暂无评论...
验证码 换一张
取 消

最新问答

问答排行榜