2010-09-24 23 views
9

Xuất thân từ một nền tảng về Clojure, tôi chụp với tiềm năng mà trước/sau điều kiện của nó cung cấp là cơ sở để thiết kế theo hợp đồng:Thiết kế theo (các) hợp đồng liên kết cho Lisp thông thường?

;; sqr.clj 

(defn sqr [n] 
    {:pre [(not= 0 n) (number? n)] 
    :post [(pos? %) (number? %)]} 
    (* n n)) 

(sqr 10) 
;=> 100 

(sqr 0) 
; Assertion error 

Có một khả năng tương tự trước/sau trong Common Lisp và/hoặc một thiết kế toàn diện hơn bởi Thư viện hợp đồng có sẵn trong tự nhiên?

Cảm ơn bạn

Trả lời

8

nó là tương đối tầm thường để viết một macro có thể được sử dụng như thế này:

(defun sqr (n) 
    (with-dbc-checked 
    (:pre ((not (zerop n)) (numberp n)) 
     :post ((plusp %) (numberp %))) 
    (* n n))) 

Đối với Clos chức năng chung, xem tại đây:. http://www.muc.de/~hoelzl/tools/dbc/dbc-intro.html

Btw, từ này mã nó có thể được nhìn thấy rằng không có trao đổi mã số là có thể giữa CL và Clojure, mà không cần viết lại bất cứ điều gì hoàn toàn.

+0

Đây chính là thư viện mà tôi đang tìm kiếm. Cảm ơn bạn. – fogus

1

Bạn có thể khẳng định:

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

Không biết chính xác những gì các phần bài được chữa để làm. :)

Các vấn đề liên quan