Macro CHECK-TYPE

UP


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))

副作用

制御がハンドラーに移行します。

デバッガーが起動されるかもしれません。

影響

*break-on-signals*

実装。

例外

なし。

参考

9.1. コンディションシステムの説明

備考

(check-type place typespec)
==  (assert (typep place 'typespec) (place)
           'type-error :datum place :expected-type 'typespec)

TOP, Github