% 関数仕様 - 実行
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 -> 60
lisp_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 -> 60
lisp_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_control
void lisp_result_control(addr x);
出力: x hold変数
第1返却値を取得します。
もし返却値が0個の場合はNIL
です。
lisp_result2_control
void lisp_result2_control(addr x, addr y);
出力: x, y hold変数
第1返却値をx
に、第2返却値をy
に取得します。
もし対応する返却値が存在しない場合はNIL
が返却されます。
lisp_values_control
void lisp_values_control(addr x);
出力: x hold変数
返却値をリストとして取得します。
Common Lispのmultiple-value-list
と同じです。
lisp_nth_value_control
void 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_control
int lisp_break_control(void);
戻り値: bool値
脱出から非脱出に切り替わるタイミングを調査します。
現在脱出モードであり、あつ現在のスタックフレームが
脱出先のスタックフレームである場合は真を返却します。
非脱出時にも実行できますが、必ず0を返却します。
lisp_escape_control
int lisp_escape_control(void);
戻り値: 脱出時は0以外
現在脱出中かどうかを調査します。
通常時であれば0、脱出時であれば0以外が返却されます。
lisp_reset_control
void lisp_reset_control(void);
脱出を中断して通常時(非脱出)に切り替えます。
脱出の理由は破棄されます。
lisp_escape_type_control
enum 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_control
void lisp_save_control(addr *ret);
出力: ret 退避用オブジェクト
脱出情報と戻り値を退避させます。
退避用に専用のオブジェクトを生成し、
現在のスタックフレーム上に配置します。
unwind-protect
のcleanup
フォームを実行するときに使います。
lisp_rollback_control
void 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
に移行します。