Macro ASSERT
assert test-form [(place*) [datum-form argument-form*]]
=> nil
test-form - フォーム。常に評価されます。
place - place。もしエラーが通知されたら評価されます。
datum-form - フォームであり評価したものをdatumとします。 評価はエラーが通知されたたびに行われ、 もしエラーが通知されなかったら行われません。
argument-form - フォームであり評価したものをargumentとします。 評価はエラーが通知されたたびに行われ、 もしエラーが通知されなかったら行われません。
datum, argument - コンディション指定子であり、 デフォルトが型error。 (これらの指定子はdatum-formと各argument-formが 評価された結果です)
assertはtest-formがtrueに評価されることを保証します。 もしtest-formがfalseに評価されたときは、 assertは修正可能なエラー(datumと各argumentによる)を通知します。 continue restartを使用してエラーの継続を行うときは、 assertがtest-formを再評価する前に、 ユーザーがplaceの値を変更することで実現します。 もしtest-formの値がnilではなかったときは、 assertはnilを返却します。
placeはtest-formに依存したデータへの一般化された参照であり、 その値はユーザーがエラーを修正することによって変更することができます。 placeのサブフォームは、エラーが通知されたときのみ評価され、 エラーが再通知されたときにも再評価されます (再通知は実際のエラーが修正されずに継続した後に発生します)。 placeの評価順序は指定されていません。 5.1.1.1. placeのサブフォームの評価をご確認ください。 もしplaceフォームが保存変数より多い値を生成して供給されたとき、 余分の値は無視されます。 もし指定したフォームが保存変数より少ない値を生成したとき、 不足した値はnilがセットされます。
(setq x (make-array '(3 5) :initial-element 3))
=> #2A((3 3 3 3 3) (3 3 3 3 3) (3 3 3 3 3))
(setq y (make-array '(3 5) :initial-element 7))
=> #2A((7 7 7 7 7) (7 7 7 7 7) (7 7 7 7 7))
(defun matrix-multiply (a b)
(let ((*print-array* nil))
(assert (and (= (array-rank a) (array-rank b) 2)
(= (array-dimension a 1) (array-dimension b 0)))
(a b)
"Cannot multiply ~S by ~S." a b)
(really-matrix-multiply a b))) => MATRIX-MULTIPLY
(matrix-multiply x y)
>> Correctable error in MATRIX-MULTIPLY:
>> Cannot multiply #<ARRAY ...> by #<ARRAY ...>.
>> Restart options:
>> 1: You will be prompted for one or more new values.
>> 2: Top level.
>> Debug> :continue 1
>> Value for A: x
>> Value for B: (make-array '(5 3) :initial-element 6)
=> #2A((54 54 54 54 54)
(54 54 54 54 54)
(54 54 54 54 54)
(54 54 54 54 54)
(54 54 54 54 54))
(defun double-safely (x) (assert (numberp x) (x)) (+ x x))
(double-safely 4)
=> 8
(double-safely t)
>> Correctable error in DOUBLE-SAFELY: The value of (NUMBERP X) must be non-NIL.
>> Restart options:
>> 1: You will be prompted for one or more new values.
>> 2: Top level.
>> Debug> :continue 1
>> Value for X: 7
=> 14アクティブなコンディションハンドラーの集合
なし。
check-type, error, 5.1. 一般化された参照
デバッガーはエラーメッセージに test-formを含める必要はなく、 placeはメッセージに含めるべきではありませんが、 利用可能なユーザーの情報はしっかりと見ておく必要があります。 もしユーザーがcontinueコマンドを提供していたら、 参照されているどんな値も変更できます。 この詳細は実装のユーザーインターフェイスのスタイルに依存します。