Дизайн по контракту Библиотеки для Common Lisp? - PullRequest
9 голосов
/ 24 сентября 2010

Исходя из опыта работы в 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 похожая возможность до / после и / или более полная библиотека Design by Contract, доступная в дикой природе?

Спасибо

Ответы [ 2 ]

8 голосов
/ 24 сентября 2010

относительно просто написать макрос, который можно использовать так:

(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, без переписывания чего-либо полностью.

1 голос
/ 24 сентября 2010

Вы можете утверждать:

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

Не знаю точно, что делать после публикации. :)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...