Исходя из опыта работы с 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, доступную в дикой природе?
Спасибо