nptのドキュメントです。
参照元:ANSI Common Lisp npt
lisp.hに記載されている下記の関数仕様を示します。
■eval
int lisp_eval_(addr x, addr pos);
int lisp_eval8_(addr x, const void *str);
int lisp_eval16_(addr x, const void *str);
int lisp_eval32_(addr x, const void *str);
■funcall
int lisp_funcall_(addr x, addr call, ...);
int lisp_funcall8_(addr x, const void *str, ...);
int lisp_funcall16_(addr x, const void *str, ...);
int lisp_funcall32_(addr x, const void *str, ...);
■apply
int lisp_apply_(addr x, addr call, ...);
int lisp_apply8_(addr x, const void *str, ...);
int lisp_apply16_(addr x, const void *str, ...);
int lisp_apply32_(addr x, const void *str, ...);
■低レベル実行
int lisp_eval_control_(addr eval);
int lisp_eval_string_control_(addr eval);
int lisp_funcall_control_(addr call, ...);
int lisp_apply_control_(addr call, ...);
■返却値操作
void lisp_result_control(addr x);
void lisp_result2_control(addr x, addr y);
void lisp_values_control(addr x);
void lisp_nth_value_control(addr x, size_t index);
void lisp_set_result_control(addr value);
void lisp_set_values_control(addr first, ...);
void lisp_set_values_nil_control(void);
void lisp_set_values_list_control(addr list);
■脱出操作
int lisp_break_control(void);
int lisp_escape_control(void);
void lisp_reset_control(void);
enum lisp_escape lisp_escape_type_control(void);
void lisp_save_control(addr *ret);
void lisp_rollback_control(addr value);
■その他
int lisp_eval_loop_(void);evalの関数です。
int lisp_eval_(addr x, addr pos);
int lisp_eval8_(addr x, const void *str);
int lisp_eval16_(addr x, const void *str);
int lisp_eval32_(addr x, const void *str);lisp_eval_int lisp_eval_(addr x, addr pos);
入力: pos オブジェクト
出力: x hold変数かNULL
戻り値: 脱出時は0以外posをLisp式としてevalを実行します。
posがhold変数の場合は、内容を使用します。
xにはeval実行結果の第1返却値が格納されます。
もしxがNULLのときは、返却値は無視されます。
lisp_eval8_int lisp_eval8_(addr x, const void *str);
int lisp_eval16_(addr x, const void *str);
int lisp_eval32_(addr x, const void *str);
入力: str Unicode文字列
出力: x hold変数かNULL
戻り値: 脱出時は0以外strをreaderでオブジェクトに変換してからevalを実行します。
xにはeval実行結果の第1返却値が格納されます。
もしxがNULLのときは、返却値は無視されます。
Unicode文字列の詳細はlisp_string8_関数をご確認ください。
lisp_eval16_lisp_eval8_で解説
lisp_eval32_lisp_eval8_で解説
funcallの関数です。
int lisp_funcall_(addr x, addr call, ...);
int lisp_funcall8_(addr x, const void *str, ...);
int lisp_funcall16_(addr x, const void *str, ...);
int lisp_funcall32_(addr x, const void *str, ...);lisp_funcall_int lisp_funcall_(addr x, addr call, ...);
入力: call symbolかfunction
入力: 可変引数
出力: x hold変数
戻り値: 脱出時は0以外callで指定した関数を実行します。
Common Lispのfuncallと同等です。
可変引数はNULLで終端します。
xには関数実行の第1返却値が格納されます。
もしxがNULLのときは、返却値は無視されます。
callと可変引数がhold変数の場合は、内容が使用されます。
lisp_funcall8_int lisp_funcall8_(addr x, const void *str, ...);
int lisp_funcall16_(addr x, const void *str, ...);
int lisp_funcall32_(addr x, const void *str, ...);
入力: str Unicode文字列
入力: 可変引数
出力: x hold変数
戻り値: 脱出時は0以外strという名前の関数を実行します。
Common Lispのfuncallと同等です。
可変引数はNULLで終端します。
xには関数実行の第1返却値が格納されます。
もしxがNULLのときは、返却値は無視されます。
可変引数がhold変数の場合は、内容が使用されます。
Unicode文字列の詳細はlisp_string8_関数をご確認ください。
実行例を下記に示します。
lisp_fixnum(x, 10);
lisp_fixnum(y, 20);
lisp_fixnum(z, 30);
lisp_funcall8_(x, "+", x, y, z, NULL);
x -> 60lisp_funcall16_lisp_funcall8_で解説
lisp_funcall32_lisp_funcall8_で解説
applyの関数です。
int lisp_apply_(addr x, addr call, ...);
int lisp_apply8_(addr x, const void *str, ...);
int lisp_apply16_(addr x, const void *str, ...);
int lisp_apply32_(addr x, const void *str, ...);lisp_apply_int lisp_apply_(addr x, addr call, ...);
入力: call symbolかfunction
入力: 可変引数
出力: x hold変数
戻り値: 脱出時は0以外callで指定した関数を実行します。
Common Lispのapplyと同等です。
可変引数はNULLで終端し最後の要素がcdr部になります。
xには関数実行の第1返却値が格納されます。
もしxがNULLのときは、返却値は無視されます。
callと可変引数がhold変数の場合は、内容が使用されます。
lisp_apply8_int lisp_apply8_(addr x, const void *str, ...);
int lisp_apply16_(addr x, const void *str, ...);
int lisp_apply32_(addr x, const void *str, ...);
入力: str Unicode文字列
入力: 可変引数
出力: x hold変数
戻り値: 脱出時は0以外strという名前の関数を実行します。
Common Lispのapplyと同等です。
可変引数はNULLで終端し最後の要素がcdr部になります。
xには関数実行の第1返却値が格納されます。
もしxがNULLのときは、返却値は無視されます。
可変引数がhold変数の場合は、内容が使用されます。
Unicode文字列の詳細はlisp_string8_関数をご確認ください。
実行例を下記に示します。
lisp_fixnum(x, 10);
lisp_fixnum(y, 20);
lisp_fixnum(z, 30);
lisp_list_(x, x, y, z, NULL);
lisp_apply8_(x, "+", x, NULL);
x -> 60lisp_apply16_lisp_apply8_で解説
lisp_apply32_lisp_apply8_で解説
実行の低レベル操作版です。
int lisp_eval_control_(addr eval);
int lisp_eval_string_control_(addr eval);
int lisp_funcall_control_(addr call, ...);
int lisp_apply_control_(addr call, ...);lisp_eval_control_int lisp_eval_control_(addr eval);
入力: eval オブジェクト
戻り値: 脱出時は0以外引数evalをevalで実行します。
返却値を取得するには、返却値のアクセス関数を使用します。
lisp_eval_string_control_int lisp_eval_string_control_(addr eval);
入力: eval 文字列
戻り値: 脱出時は0以外引数evalをreaderでオブジェクトに変換してからevalで実行します。
返却値を取得するには、返却値のアクセス関数を使用します。
lisp_funcall_control_int lisp_funcall_control_(addr call, ...);
入力: call symbolかfunction
入力: 可変引数
戻り値: 脱出時は0以外callで指定した関数を実行します。
Common Lispのfuncallと同等です。
可変引数はNULLで終端します。
callと可変引数がhold変数の場合は、内容が使用されます。 返却値を取得するには、返却値のアクセス関数を使用します。
lisp_apply_control_int lisp_apply_control_(addr call, ...);
入力: call symbolかfunction
入力: 可変引数
戻り値: 脱出時は0以外callで指定した関数を実行します。
Common Lispのapplyと同等です。
可変引数はNULLで終端し最後の要素がcdr部になります。
callと可変引数がhold変数の場合は、内容が使用されます。 返却値を取得するには、返却値のアクセス関数を使用します。
返却値を操作する関数です。
void lisp_result_control(addr x);
void lisp_result2_control(addr x, addr y);
void lisp_values_control(addr x);
void lisp_nth_value_control(addr x, size_t index);
void lisp_set_result_control(addr value);
void lisp_set_values_control(addr first, ...);
void lisp_set_values_nil_control(void);
void lisp_set_values_list_control(addr list);lisp_result_controlvoid lisp_result_control(addr x);
出力: x hold変数第1返却値を取得します。
もし返却値が0個の場合はNILです。
lisp_result2_controlvoid lisp_result2_control(addr x, addr y);
出力: x, y hold変数第1返却値をxに、第2返却値をyに取得します。
もし対応する返却値が存在しない場合はNILが返却されます。
lisp_values_controlvoid lisp_values_control(addr x);
出力: x hold変数返却値をリストとして取得します。
Common Lispのmultiple-value-listと同じです。
lisp_nth_value_controlvoid lisp_nth_value_control(addr x, size_t index);
入力: index 取得インデックス
出力: x hold変数index番目の返却値を取得します。
Common Lispのnth-valueとほぼ同じです。
対応する値が存在しない場合はNILが返却されます。
脱出の操作関数です。
int lisp_break_control(void);
int lisp_escape_control(void);
void lisp_reset_control(void);
enum lisp_escape lisp_escape_type_control(void);
void lisp_save_control(addr *ret);
void lisp_rollback_control(addr value);lisp_break_controlint lisp_break_control(void);
戻り値: bool値脱出から非脱出に切り替わるタイミングを調査します。
現在脱出モードであり、あつ現在のスタックフレームが 脱出先のスタックフレームである場合は真を返却します。
非脱出時にも実行できますが、必ず0を返却します。
lisp_escape_controlint lisp_escape_control(void);
戻り値: 脱出時は0以外現在脱出中かどうかを調査します。
通常時であれば0、脱出時であれば0以外が返却されます。
lisp_reset_controlvoid lisp_reset_control(void);脱出を中断して通常時(非脱出)に切り替えます。
脱出の理由は破棄されます。
lisp_escape_type_controlenum lisp_escape lisp_escape_type_control(void);
戻り値: 脱出モード脱出のモードを調査します。
戻り値は下記のとおりです。
| 戻り値 | モード |
|---|---|
| lisp_escape_normal | 非脱出時 |
| lisp_escape_tagbody | tagbody/goによる脱出中 |
| lisp_escape_block | block/return-fromによる脱出中 |
| lisp_escape_catch | catch/throwによる脱出中 |
| lisp_escape_handler_case | handler-caseによる脱出中 |
| lisp_escape_restart_case | restart-caseによる脱出中 |
lisp_save_controlvoid lisp_save_control(addr *ret);
出力: ret 退避用オブジェクト脱出情報と戻り値を退避させます。
退避用に専用のオブジェクトを生成し、 現在のスタックフレーム上に配置します。
unwind-protectのcleanupフォームを実行するときに使います。
lisp_rollback_controlvoid lisp_rollback_control(addr value);
入力: value 退避用オブジェクトlisp_save_controlで作成した退避用オブジェクトを用いて、 脱出情報と戻り値を更新します。
valueがhold変数の場合はエラーです。
その他の操作関数です。
int lisp_eval_loop_(void);lisp_eval_loop_int lisp_eval_loop_(void);
戻り値: 脱出時は0以外eval-loopに移行します。