Macro CHECK-TYPE
check-type place typespec [string] => nil
place - place
typespec - 型指定子
string - 文字列。評価されます。
check-typeは、 placeの内容が型typespecではなかったときに、 型type-errorの修正可能なエラーを通知します。
check-typeは、ただstore-value restartが 明示的に起動されたか、あるいはデバッガーのオプションによって 暗に起動されたときのみ返却可能です。 もしstore-value restartが起動されたとき、 check-typeは実行された(あるいはデバッガーによって対話的に行われた) restartの引数の値を新しい値としてplaceに格納してから最初に戻り、 新しい値がその型であるかどうかをチェックして、 いまだに希望した型になっていないときは違うエラーが通知されます。
最初にplaceが評価されたときは、 その評価は通常の評価の規則によって行われます。 そのあとは、もしチェックが失敗して store-value restartが使われたときに、 placeとして評価が行われます。 5.1.1.1. placeのサブフォームの評価をご確認ください。
stringは、その型についての 不定冠詞("a"か"an")で始まる英語の説明でなければなりません。 もしstringが指定されなかったときは、 それはtypespecから自動的に計算されます。 自動的に計算されるメッセージは、 placeと、その内容と、希望する型について言及します。 実装は、check-typeを呼び出した関数の引数のひとつなどを見て、 placeが特定の形式であることを認識した場合は、 多少異なる言葉でエラーメッセージを生成するかどうかを 選ぶことができます。 check-typeの適用によっては、 typespecから自動的に生成するよりも 何が要求されているのかをより具体的に 記載することを求められることがあるため、 stringの引数が用意されています。
(setq aardvarks '(sam harry fred))
=> (SAM HARRY FRED)
(check-type aardvarks (array * (3)))
>> Error: The value of AARDVARKS, (SAM HARRY FRED),
>> is not a 3-long array.
>> To continue, type :CONTINUE followed by an option number:
>> 1: Specify a value to use instead.
>> 2: Return to Lisp Toplevel.
>> Debug> :CONTINUE 1
>> Use Value: #(SAM FRED HARRY)
=> NIL
aardvarks
=> #<ARRAY-T-3 13571>
(map 'list #'identity aardvarks)
=> (SAM FRED HARRY)
(setq aardvark-count 'foo)
=> FOO
(check-type aardvark-count (integer 0 *) "A positive integer")
>> Error: The value of AARDVARK-COUNT, FOO, is not a positive integer.
>> To continue, type :CONTINUE followed by an option number:
>> 1: Specify a value to use instead.
>> 2: Top level.
>> Debug> :CONTINUE 2
(defmacro define-adder (name amount)
(check-type name (and symbol (not null)) "a name for an adder function")
(check-type amount integer)
`(defun ,name (x) (+ x ,amount)))
(macroexpand '(define-adder add3 3))
=> (defun add3 (x) (+ x 3))
(macroexpand '(define-adder 7 7))
>> Error: The value of NAME, 7, is not a name for an adder function.
>> To continue, type :CONTINUE followed by an option number:
>> 1: Specify a value to use instead.
>> 2: Top level.
>> Debug> :Continue 1
>> Specify a value to use instead.
>> Type a form to be evaluated and used instead: 'ADD7
=> (defun add7 (x) (+ x 7))
(macroexpand '(define-adder add5 something))
>> Error: The value of AMOUNT, SOMETHING, is not an integer.
>> To continue, type :CONTINUE followed by an option number:
>> 1: Specify a value to use instead.
>> 2: Top level.
>> Debug> :Continue 1
>> Type a form to be evaluated and used instead: 5
=> (defun add5 (x) (+ x 5))制御がハンドラーに移行します。
デバッガーが起動されるかもしれません。
実装。
なし。
9.1. コンディションシステムの説明
(check-type place typespec)
== (assert (typep place 'typespec) (place)
'type-error :datum place :expected-type 'typespec)