fog*_*gus 9 lisp design-by-contract clojure 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
Run Code Online (Sandbox Code Playgroud)
Common Lisp中是否有类似的前/后功能和/或更全面的Design by Contract库?
谢谢
编写一个可以像这样使用的宏是相对微不足道的:
(defun sqr (n)
(with-dbc-checked
(:pre ((not (zerop n)) (numberp n))
:post ((plusp %) (numberp %)))
(* n n)))
Run Code Online (Sandbox Code Playgroud)
有关CLOS通用函数,请参见此处:http://www.muc.de/~hoelzl/tools/dbc/dbc-intro.html
顺便说一句,从这段代码可以看出,CL和Clojure之间可以进行零代码交换,而无需完全重写任何内容.
| 归档时间: |
|
| 查看次数: |
620 次 |
| 最近记录: |