% Macro CHECK-TYPE
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)