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)
=> MATRIX-MULTIPLY
(really-matrix-multiply a b)))
(matrix-multiply x y)error in MATRIX-MULTIPLY:
>> Correctable > by #<ARRAY ...>.
>> Cannot multiply #<ARRAY ...
>> Restart options:1: You will be prompted for one or more new values.
>> 2: Top level.
>> 1
>> Debug> :continue
>> Value for A: xmake-array '(5 3) :initial-element 6)
>> Value for B: (=> #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))
(4)
(double-safely => 8
t)
(double-safely error in DOUBLE-SAFELY: The value of (NUMBERP X) must be non-NIL.
>> Correctable
>> Restart options:1: You will be prompted for one or more new values.
>> 2: Top level.
>> 1
>> Debug> :continue 7
>> Value for X: => 14
アクティブなコンディションハンドラーの集合
なし。
check-type
, error
, 5.1. 一般化された参照
デバッガーはエラーメッセージに test-formを含める必要はなく、 placeはメッセージに含めるべきではありませんが、 利用可能なユーザーの情報はしっかりと見ておく必要があります。 もしユーザーがcontinue
コマンドを提供していたら、 参照されているどんな値も変更できます。 この詳細は実装のユーザーインターフェイスのスタイルに依存します。