9

Clojure のバックグラウンドを持つ私は、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 ライブラリはありますか?

ありがとうございました

4

2 に答える 2

8

次のように使用できるマクロを作成するのは比較的簡単です。

(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 の間で可能なコード交換はゼロであることがわかります。

于 2010-09-24T14:36:32.870 に答える
1

あなたは主張することができます:

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

投稿部分が何をすべきか正確にはわかりません。:)

于 2010-09-24T15:44:56.927 に答える