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),not a 3-long array.
>> is continue, type :CONTINUE followed by an option number:
>> To 1: Specify a value to use instead.
>> 2: Return to Lisp Toplevel.
>> 1
>> Debug> :CONTINUE
>> 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")
(not a positive integer.
>> Error: The value of AARDVARK-COUNT, FOO, is continue, type :CONTINUE followed by an option number:
>> To 1: Specify a value to use instead.
>> 2: Top level.
>> 2
>> Debug> :CONTINUE 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))
(7, is not a name for an adder function.
>> Error: The value of NAME, continue, type :CONTINUE followed by an option number:
>> To 1: Specify a value to use instead.
>> 2: Top level.
>> 1
>> Debug> :Continue
>> Specify a value to use instead.and used instead: 'ADD7
>> Type a form to be evaluated => (defun add7 (x) (+ x 7))
macroexpand '(define-adder add5 something))
(not an integer.
>> Error: The value of AMOUNT, SOMETHING, is continue, type :CONTINUE followed by an option number:
>> To 1: Specify a value to use instead.
>> 2: Top level.
>> 1
>> Debug> :Continue and used instead: 5
>> Type a form to be evaluated => (defun add5 (x) (+ x 5))
制御がハンドラーに移行します。
デバッガーが起動されるかもしれません。
実装。
なし。
9.1. コンディションシステムの説明
check-type place typespec)
(assert (typep place 'typespec) (place)
== ( 'type-error :datum place :expected-type 'typespec)