Clojure 通用Lisp的契约库设计?

Clojure 通用Lisp的契约库设计?,clojure,lisp,common-lisp,design-by-contract,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中是否有类似的前置/后置功能和/或在野外是否有更全面的契约式设计库 谢谢编写一个可以这样使用的宏相

来自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中是否有类似的前置/后置功能和/或在野外是否有更全面的契约式设计库


谢谢

编写一个可以这样使用的宏相对来说比较简单:

(defun sqr (n)
  (with-dbc-checked
     (:pre  ((not (zerop n)) (numberp n))
      :post ((plusp %) (numberp %)))
    (* n n)))
有关CLOS通用函数,请参见此处:

顺便说一句,从这段代码可以看出,CL和Clojure之间不可能进行任何代码交换,而不需要完全重写任何内容。

您可以断言:

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

不知道帖子部分到底要做什么。:)

这正是我要找的图书馆。非常感谢。