% Macro ASSERT
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
コマンドを提供していたら、
参照されているどんな値も変更できます。
この詳細は実装のユーザーインターフェイスのスタイルに依存します。