Next: , Previous: , Up: Top   [Contents][Index]


13 アサーションとエラー

この節はアサーション、すなわちプログラムが正しく働いている場合に 真でなければならない条件をテストする2つのマクロを記述する。 アサーションは、Lispプログラムの振る舞いに決して何も追加しない; すべてがそうあるべきであるように、単に“正気のチェック” をするだけである。

最適化属性speedが3にセットされており、safetyが3より 小さい場合、バイトコンパイラは、下記のアサーションを最適化し去る。 アサーションは最適化し去られるかもしれないので、それらが副作用を 含むことは悪い考えである。

Special Form: assert test-form [show-args string args…]

このフォームは、test-formが真である(すなわち評価して非nil 値になる)ことを確かめる。そうである場合、nilを戻す。テストが 満足されない場合、assertはエラーを通知する。

test-formを含む既定のエラーメッセージが得られる。string 引数と付加的な余分の引数を含むことで、異なるエラーメッセージを 指定できる。これらの引数は、エラーを通知するために単にerrorへ 渡される。

付加的な第2の引数show-argsnilではなくtである場合、 エラーメッセージは(stringがあってもなくても)、トップレベル formのあらゆる非定数引数を含む。たとえば:

(assert (> x 10) t "x is too small: %d")

このshow-argsの使用法は、Common Lispへの拡張である。真のCommon Lispでは、第2引数は、エラーからの継続の前にユーザーによってsetf 可能なplacesのリストを与える。Emacs Lispは継続可能なエラーを サポートしないので、placesを指定することは意味がない。

Special Form: check-type form type [string]

このフォームは、formは評価して型typeの値になるかを確かめる。 そうである場合、nilを戻す。そうでない場合、check-typewrong-type-argumentエラーを通知する。既定のエラーメッセージは、 typeform自身に加えて、誤った値をリストする。string が指定される場合、それはエラーメッセージのtypeの場所へ含められる。 たとえば:

(check-type x (integer 1 *) "a positive integer")

typeに使われてよい型指定子の記述は、See データ型の述語.

Common Lispでは、check-typeへの第1引数はsetfでの使用に 適切なplaceでなければならないことに注意せよ。なぜなら check-typeは、ユーザがplaceを修正することを許す継続可能な エラーを通知するからである。

下記のエラー関連マクロも定義される:

Special Form: ignore-errors forms…

これは、正確にprognのようにformsを実行するが、forms の間はエラーが無視される点が異なる。より正確には、エラーが通知された 場合、ignore-errorsは直ちにformsの実行を中止してnil を戻す。formsが正常に終了する場合、ignore-errorsは最後の formの結果を戻す。