Macro ASSERT

UP


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が 評価された結果です)

定義

asserttest-formtrueに評価されることを保証します。 もしtest-formfalseに評価されたときは、 assertは修正可能なエラー(datumと各argumentによる)を通知します。 continue restartを使用してエラーの継続を行うときは、 asserttest-formを再評価する前に、 ユーザーがplaceの値を変更することで実現します。 もしtest-formの値がnilではなかったときは、 assertnilを返却します。

placetest-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

影響

*break-on-signals*

アクティブなコンディションハンドラーの集合

例外

なし。

参考

check-type, error, 5.1. 一般化された参照

備考

デバッガーはエラーメッセージに test-formを含める必要はなく、 placeはメッセージに含めるべきではありませんが、 利用可能なユーザーの情報はしっかりと見ておく必要があります。 もしユーザーがcontinueコマンドを提供していたら、 参照されているどんな値も変更できます。 この詳細は実装のユーザーインターフェイスのスタイルに依存します。


TOP, Github