srfi.253 - データ型検査 ¶このSRFIは、変数や引数の値の型を検査するフォームを定義します。
[SRFI-253]{srfi.253}
exprがtype-prefに合致しているかどうかをチェックします。
type-predはexprの値を受け取って合致してれば真の値を返す
型述語か、of-type?に渡せる型オブジェクトです。
(型オブジェクトを渡すのはSRFIに対するGaucheの拡張です)。
SRFIの仕様では、検査は必ずしも行わなくて良いことになっています。 例えば実装は最適化レベルを上げた場合に検査を省略するかもしれません。 Gaucheは今のところ必ず検査しますが、 将来検査を省くオプションを導入する可能性はあります。
省略可能な引数caller (評価されます)は、 エラーの発生箇所(手続き名など)を示すのに使えます。
注: Gaucheは、ごく初期のSRFIで使うために非公式にcheck-argマクロを
持っていました。既存のライブラリがっそれに依存している可能性があるので、
今でもこのマクロはコアで提供され、srfi.253は単にそれを再エクスポート
しています。ただ、ユーザはcheck-argマクロを使いたければ
srfi.253を明示的にuseしてください。その方がポータブルですし。
組み込みのcheck-argは将来無くすかもしれません。
モジュールの残りは、典型的なパターンを
check-argを呼び出す式に展開するマクロです。
[SRFI-253]{srfi.253}
val …に並べられた複数の値を返しますが、
各値は対応するtypeを(check-arg type val)のように使って
検査されます。(values val …)に型検査を追加したものと
考えることもできます。
[SRFI-253]{srfi.253}
exprを評価し、その値を順にtype-predで、check-argと同じように
検査してゆきます(つまり、type-predは型述語か型オブジェクトです)。
epxrの値が求める型に合致したら、そこで検査を打ち切り、
続くbody …を評価して最後の値を返します。
exprの値がいずれのtype-predも満たさなかった場合、
else節があればelse-body …が評価され、
なければエラーが投げられます
(Gaucheは常にエラーを投げますが、
SRFIはエラーを必ず投げることは要求していません)。
typecaseも見て下さい (条件式)。
[SRFI-253]{srfi.253}
lambda、case-lambdaと似ていますが、
formalsの各引数 (最後の残余引数以外)
に(arg type-pred)を置くことができます。その引数は
(check-arg arg type-pred 'lambda-checked)で
検査されます。
(lambda-checked (obj (i integer?) (j integer?) . opts) ...) ≡ (lambda (obj i j . opts) (check-arg i integer? 'lambda-checked) (check-arg j integer? 'lambda-checked) ...)
[SRFI-253]{srfi.253}
最初の形式は
(define name (lambda-checked formals+ body …
の短縮形です。ただし、'nameがcheck-arg
のcaller引数に渡されます。
二番目の形式は
(define name (values-checked (type-pred) value)の短縮形です。
[SRFI-253]{srfi.253}
define-record-typeと同様に、レコード型とその
コンストラクタ、フィールドアクセサ、フィールドモディファイアを定義します。
各フィールドは(field-name type-red accessor-name)もしくは
(field-name type-pred accessor-name modifier-name)の形式で、
type-predがvalues-checkedやcheck-argによって
アクセサが返す値とモディファイアが受けとる値を検査するのに使われます。
また、コンストラクタに渡された値がフィールドに対する正しい型かどうかも検査されます。