作为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
(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之间无法进行任何代码交换。
你可以断言:
(defun sqr (n)
(assert (and
(not (zerop n))
(numberp n)))
(* n n))
不太清楚这个“post”部分的作用是什么。:)