この節はアサーション、すなわちプログラムが正しく働いている場合に 真でなければならない条件をテストする2つのマクロを記述する。 アサーションは、Lispプログラムの振る舞いに決して何も追加しない; すべてがそうあるべきであるように、単に“正気のチェック” をするだけである。
最適化属性speed
が3にセットされており、safety
が3より
小さい場合、バイトコンパイラは、下記のアサーションを最適化し去る。
アサーションは最適化し去られるかもしれないので、それらが副作用を
含むことは悪い考えである。
このフォームは、test-formが真である(すなわち評価して非nil
値になる)ことを確かめる。そうである場合、nil
を戻す。テストが
満足されない場合、assert
はエラーを通知する。
test-formを含む既定のエラーメッセージが得られる。string
引数と付加的な余分の引数を含むことで、異なるエラーメッセージを
指定できる。これらの引数は、エラーを通知するために単にerror
へ
渡される。
付加的な第2の引数show-argsがnil
ではなくt
である場合、
エラーメッセージは(stringがあってもなくても)、トップレベル
formのあらゆる非定数引数を含む。たとえば:
(assert (> x 10) t "x is too small: %d")
このshow-argsの使用法は、Common Lispへの拡張である。真のCommon
Lispでは、第2引数は、エラーからの継続の前にユーザーによってsetf
可能なplacesのリストを与える。Emacs Lispは継続可能なエラーを
サポートしないので、placesを指定することは意味がない。
このフォームは、formは評価して型typeの値になるかを確かめる。
そうである場合、nil
を戻す。そうでない場合、check-type
は
wrong-type-argument
エラーを通知する。既定のエラーメッセージは、
typeとform自身に加えて、誤った値をリストする。string
が指定される場合、それはエラーメッセージのtypeの場所へ含められる。
たとえば:
(check-type x (integer 1 *) "a positive integer")
typeに使われてよい型指定子の記述は、See データ型の述語.
Common Lispでは、check-type
への第1引数はsetf
での使用に
適切なplaceでなければならないことに注意せよ。なぜなら
check-type
は、ユーザがplaceを修正することを許す継続可能な
エラーを通知するからである。
下記のエラー関連マクロも定義される:
これは、正確にprogn
のようにformsを実行するが、forms
の間はエラーが無視される点が異なる。より正確には、エラーが通知された
場合、ignore-errors
は直ちにformsの実行を中止してnil
を戻す。formsが正常に終了する場合、ignore-errors
は最後の
formの結果を戻す。