Clojure 通用Lisp的契约库设计?
来自Clojure的背景,我被其前/后条件作为合同设计基础的潜力所吸引: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中是否有类似的前置/后置功能和/或在野外是否有更全面的契约式设计库 谢谢编写一个可以这样使用的宏相
;; 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))
不知道帖子部分到底要做什么。:) 这正是我要找的图书馆。非常感谢。