Common Lisp的合约设计?

时间:2010-09-24 14:22:29

标签: clojure lisp common-lisp design-by-contract

来自Clojure的背景,我认为它的前/后条件可以作为合同设计的基础:

;; sqr.clj

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

(sqr 10)
;=> 100

(sqr 0)
; Assertion error

Common Lisp中是否有类似的前/后功能和/或更全面的Design by Contract库?

谢谢

2 个答案:

答案 0 :(得分:8)

编写一个可以像这样使用的宏是相对简单的:

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

对于CLOS通用函数,请参见此处:http://www.muc.de/~hoelzl/tools/dbc/dbc-intro.html

顺便说一下,从这段代码可以看出,CL和Clojure之间没有代码交换,没有完全重写任何内容。

答案 1 :(得分:1)

你可以断言:

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

不确切知道帖子部分要做什么。 :)