関数仕様 - エラー

nptのドキュメントです。
参照元:ANSI Common Lisp npt

関数仕様

lisp.hに記載されている下記の関数仕様を示します。

■abort
void lisp_abort(void);
void lisp_abortf(const char *fmt, ...);
void lisp_abort8(const void *fmt, ...);
void lisp_abort16(const void *fmt, ...);
void lisp_abort32(const void *fmt, ...);
lisp_abort_calltype lisp_set_abort_handler(lisp_abort_calltype call);
lisp_abort_calltype lisp_set_abort_setjmp_handler(void);
Lisp_abort_Begin
Lisp_abort_End
Lisp_abort_throw

■signal
int lisp_signal_(addr condition);
int lisp_error_(addr condition);

■error
int lisp_error8_(const void *str, ...);
int lisp_error16_(const void *str, ...);
int lisp_error32_(const void *str, ...);

■warn
int lisp_warn8_(const void *str, ...);
int lisp_warn16_(const void *str, ...);
int lisp_warn32_(const void *str, ...);

■abort

LISP ABORTの関数です。

void lisp_abort(void);
void lisp_abortf(const char *fmt, ...);
void lisp_abort8(const void *fmt, ...);
void lisp_abort16(const void *fmt, ...);
void lisp_abort32(const void *fmt, ...);
lisp_abort_calltype lisp_set_abort_handler(lisp_abort_calltype call);
lisp_abort_calltype lisp_set_abort_setjmp_handler(void);
Lisp_abort_Begin
Lisp_abort_End
Lisp_abort_throw

関数lisp_abort

void lisp_abort(void);

LISP ABORTを実行します。
LISP ABORT実行時には下記の挙動を行います。

関数lisp_abortf

void lisp_abortf(const char *fmt, ...);

入力: fmt `printf`書式

標準エラーにメッセージを出力してからLISP ABORTします。
Lispは使用しませんので、いつでも実行できます。

関数lisp_abort8

void lisp_abort8(const void *fmt, ...);
void lisp_abort16(const void *fmt, ...);
void lisp_abort32(const void *fmt, ...);

入力: fmt Unicode文字列

lisp_format_関数を用いて error-outputにエラーメッセージを出力したあと、 LISP ABORTします。
Lispで処理を行いますので、Common Lispが実行可能状態である必要があります。
Unicode文字列の詳細はlisp_string8_関数をご確認ください。

関数lisp_abort16

lisp_abort8で解説

関数lisp_abort32

lisp_abort8で解説

関数lisp_set_abort_handler

lisp_abort_calltype lisp_set_abort_handler(lisp_abort_calltype call);

入力: call ハンドラー void (*)(void)
戻り値: 設定前のハンドラー

LISP ABORT実行時に呼び出されるハンドラーを指定します。
もし引数がNULLの場合は、ハンドラーを削除します。

関数lisp_set_abort_setjmp_handler

lisp_abort_calltype lisp_set_abort_setjmp_handler(void);

戻り値: 設定前のハンドラー

setjmp用のハンドラーを設定します。

マクロLisp_abort_Begin

#define Lisp_abort_Begin ...
#define Lisp_abort_End ...
#define Lisp_abort_throw() ...

LISP ABORTの捕捉を行います。
この仕組みを使用するためには、lisp_set_abort_setjmp_handlerを実行して setjmp用のハンドラーを設定する必要があります。

捕捉はLisp_abort_BeginLisp_abort_Endを使い、 次のようにしてコードを囲みます。

Lisp_abort_Begin {
    /* code */
}
Lisp_abort_End;

もしLisp_abort_throw()が実行された場合は、 longjmpによりLisp_abort_Endまで制御がジャンプします。

lisp_set_abort_setjmp_handlerが登録するハンドラーは、 単純にLisp_abort_throw()が実行されるだけのコードであり、 例えば下記のような関数になります。

void abort_setjmp_handler(void)
{
    Lisp_abort_throw();
}

通常であればマクロはsetjmp/longjmpに展開されますが、 C++コンパイラでかつLISP_ABORT_SETJMPがdefineされていない場合は try/catchに展開されます。

典型的な使用例を下記に示します。

int main(void)
{
    int finish;
    lisp_abort_calltype handler;

    handler = lisp_set_abort_setjmp_handler();
    finish = 0;
    Lisp_abort_Begin {
        lisp_abort();
        finish = 1;
    }
    Lisp_abort_End;
    lisp_set_abort_handler(handler);

    if (finish == 0)
        printf("LISP ABORT\n");

    return 0;
}

マクロLisp_abort_End

Lisp_abort_Beginで解説

マクロLisp_abort_throw

Lisp_abort_Beginで解説

■signal

コンディションを発生させる関数です。

int lisp_signal_(addr condition);
int lisp_error_(addr condition);

脱出関数lisp_signal_

int lisp_signal_(addr condition);

入力: condition インスタンス
戻り値: 脱出時は0以外

引数conditionsignalに渡します。
Common Lispのsignalと同じです。
conditionがhold変数の場合は、内容が使用されます。

脱出関数lisp_error_

int lisp_error_(addr condition);

入力: condition インスタンス
戻り値: 0以外

引数conditionerrorに渡します。
Common Lispのerrorと同じです。
conditionがhold変数の場合は、内容が使用されます。

■error

エラーの関数です。

int lisp_error8_(const void *str, ...);
int lisp_error16_(const void *str, ...);
int lisp_error32_(const void *str, ...);

脱出関数lisp_error8_

int lisp_error8_(const void *str, ...);
int lisp_error16_(const void *str, ...);
int lisp_error32_(const void *str, ...);

入力: str Unicode文字列
戻り値: 0以外

引数simple-error conditionを起こします。
Common Lispのerrorと同じです。
Unicode文字列の詳細はlisp_string8_関数をご確認ください。

脱出関数lisp_error16_

lisp_error8_で解説

脱出関数lisp_error32_

lisp_error8_で解説

■warn

警告の関数です。

int lisp_warn8_(const void *str, ...);
int lisp_warn16_(const void *str, ...);
int lisp_warn32_(const void *str, ...);

脱出関数lisp_warn8_

int lisp_warn8_(const void *str, ...);
int lisp_warn16_(const void *str, ...);
int lisp_warn32_(const void *str, ...);

入力: str Unicode文字列
戻り値: 脱出時は0以外

引数simple-warning conditionを起こします。
Common Lispのwarnと同じです。
Unicode文字列の詳細はlisp_string8_関数をご確認ください。

脱出関数lisp_warn16_

lisp_warn8_で解説

脱出関数lisp_warn32_

lisp_warn8_で解説