Condition System #2 error とかの引数

${XYZZY}/lisp/handler.l 参照。error, warn, signal 全部共通。

A. error CONDITION

コンディション・オブジェクト(make-condition で作る奴)を渡すと、そのまま投げる。

B. error CONDITION-TYPE &rest ARGS

CONDITION-TYPE のコンディション・オブジェクトを作って投げる。ARGS はそのコンディションのスロットをキーワード引数の形で。

(error 'some-condition :slot value)
== (error (make-condition 'some-condition :slot value))

C. error FMT-CTRL &rest ARGS

simple-error(warn だと simple-warning、signal だと simple-condition)というコンディションを作って投げる。FMT-CTRL と ARGS は format で使うアレ。コンディションとしては :format-string*1 に FMT-CTRL を、:format-arguments に ARGS を持つ。

(error "~S が ~S で ~S" foo bar baz)
== (error 'simple-error
          :format-string "~S が ~S で ~S"
          :format-arguments (list foo bar baz))
== (error (make-condition 'simple-error
                          :format-string "~S が ~S で ~S"
                          :format-arguments (list foo bar baz)))


いずれにしろ結局はコンディション・オブジェクトを(作って)投げるんで、B や C は省略記法みたいなもん。そして C が便利すぎて A や B はほとんど見たことがない。

*1:Common Lisp では :format-control