Common Lisp的设计契约库?

9

作为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中是否存在类似的前/后置条件功能,或者更全面的按合同设计库?谢谢。
2个回答

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之间无法进行任何代码交换。


这正是我正在寻找的库。谢谢你。 - fogus

1

你可以断言:

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

不太清楚这个“post”部分的作用是什么。:)


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接