% 関数仕様 - 関数
nptのドキュメントです。
参照元:ANSI Common Lisp npt
lisp.hに記載されている下記の関数仕様を示します。
■function
void lisp_get_function(addr x, addr symbol);
void lisp_get_setf(addr x, addr symbol);
int lisp_get_function_(addr x, addr value);
int lisp_get_function8_(addr x, const void *str);
int lisp_get_function16_(addr x, const void *str);
int lisp_get_function32_(addr x, const void *str);
int lisp_get_setf_(addr x, addr value);
int lisp_get_setf8_(addr x, const void *str);
int lisp_get_setf16_(addr x, const void *str);
int lisp_get_setf32_(addr x, const void *str);
■compiled-function
void lisp_compiled_dynamic(int index, lisp_calltype_dynamic call);
void lisp_compiled_rest(int index, lisp_calltype_rest call);
void lisp_compiled_empty(int index, lisp_calltype_empty call);
void lisp_compiled_var1(int index, lisp_calltype_var1 call);
void lisp_compiled_var2(int index, lisp_calltype_var2 call);
void lisp_compiled_var3(int index, lisp_calltype_var3 call);
int lisp_compiled_function_(addr x, int index, addr symbol);
int lisp_compiled_function8_(addr x, int index, const void *str);
int lisp_compiled_function16_(addr x, int index, const void *str);
int lisp_compiled_function32_(addr x, int index, const void *str);
int lisp_compiled_defun_(int index, addr symbol);
int lisp_compiled_defun8_(int index, const void *str);
int lisp_compiled_defun16_(int index, const void *str);
int lisp_compiled_defun32_(int index, const void *str);
int lisp_compiled_defun_setf_(int index, addr symbol);
int lisp_compiled_defun_setf8_(int index, const void *str);
int lisp_compiled_defun_setf16_(int index, const void *str);
int lisp_compiled_defun_setf32_(int index, const void *str);
void lisp_compiled_setvalue(addr pos, addr value);
void lisp_compiled_getvalue(addr *ret);
symbolから関数オブジェクトを取得する関数です。
void lisp_get_function(addr x, addr symbol);
void lisp_get_setf(addr x, addr symbol);
int lisp_get_function_(addr x, addr value);
int lisp_get_function8_(addr x, const void *str);
int lisp_get_function16_(addr x, const void *str);
int lisp_get_function32_(addr x, const void *str);
int lisp_get_setf_(addr x, addr value);
int lisp_get_setf8_(addr x, const void *str);
int lisp_get_setf16_(addr x, const void *str);
int lisp_get_setf32_(addr x, const void *str);
lisp_get_functionvoid lisp_get_function(addr x, addr symbol);
入力: symbol symbol型オブジェクト
出力: x hold変数
symbolから関数オブジェクトを取得します。
Common Lispのsymbol-functionと同じです。
valueがhold変数の場合は、内容を使用します。
関数がunboundの場合はNULLが返却されます。
引数がsymbol型ではない場合はLISP ABORTします。
lisp_get_setfvoid lisp_get_setf(addr x, addr symbol);
入力: symbol symbol型オブジェクト
出力: x hold変数
symbolからsetfの関数オブジェクトを取得します。
Common Lispの(fdefinition (list 'setf symbol))と同じです。
valueがhold変数の場合は、内容を使用します。
関数がunboundの場合はNULLが返却されます。
引数がsymbol型ではない場合はLISP ABORTします。
lisp_get_function_int lisp_get_function_(addr x, addr value);
入力: value オブジェクト
出力: x hold変数
戻り値: 脱出時は0以外
valueがsymbolの場合は関数を取得します。
valueがfunction型の場合は値をそのまま返却します。
valueがhold変数の場合は、内容を使用します。
関数がunboundの場合はNULLが返却されます。
lisp_get_function8_int lisp_get_function8_(addr x, const void *str);
int lisp_get_function16_(addr x, const void *str);
int lisp_get_function32_(addr x, const void *str);
入力: str Unicode文字列
出力: x hold変数
戻り値: 脱出時は0以外
strをsymbol名として関数を取得します。
関数がunboundの場合はNULLが返却されます。
Unicode文字列の詳細はlisp_string8_関数をご確認ください。
lisp_get_function16_lisp_get_function8_で解説
lisp_get_function32_lisp_get_function8_で解説
lisp_get_setf_int lisp_get_setf_(addr x, addr value);
入力: value オブジェクト
出力: x hold変数
戻り値: 脱出時は0以外
valueがsymbolの場合はsetf関数を取得します。
valueがfunction型の場合は値をそのまま返却します。
valueがhold変数の場合は、内容を使用します。
関数がunboundの場合はNULLが返却されます。
lisp_get_setf8_int lisp_get_setf8_(addr x, const void *str);
int lisp_get_setf16_(addr x, const void *str);
int lisp_get_setf32_(addr x, const void *str);
入力: str Unicode文字列
出力: x hold変数
戻り値: 脱出時は0以外
strをsymbol名としてsetf関数を取得します。
関数がunboundの場合はNULLが返却されます。
Unicode文字列の詳細はlisp_string8_関数をご確認ください。
lisp_get_setf16_lisp_get_setf8_で解説
lisp_get_setf32_lisp_get_setf8_で解説
関数作成のための関数です。
void lisp_compiled_dynamic(int index, lisp_calltype_dynamic call);
void lisp_compiled_rest(int index, lisp_calltype_rest call);
void lisp_compiled_empty(int index, lisp_calltype_empty call);
void lisp_compiled_var1(int index, lisp_calltype_var1 call);
void lisp_compiled_var2(int index, lisp_calltype_var2 call);
void lisp_compiled_var3(int index, lisp_calltype_var3 call);
int lisp_compiled_function_(addr x, int index, addr symbol);
int lisp_compiled_function8_(addr x, int index, const void *str);
int lisp_compiled_function16_(addr x, int index, const void *str);
int lisp_compiled_function32_(addr x, int index, const void *str);
int lisp_compiled_defun_(int index, addr symbol);
int lisp_compiled_defun8_(int index, const void *str);
int lisp_compiled_defun16_(int index, const void *str);
int lisp_compiled_defun32_(int index, const void *str);
int lisp_compiled_defun_setf_(int index, addr symbol);
int lisp_compiled_defun_setf8_(int index, const void *str);
int lisp_compiled_defun_setf16_(int index, const void *str);
int lisp_compiled_defun_setf32_(int index, const void *str);
void lisp_compiled_setvalue(addr pos, addr value);
void lisp_compiled_getvalue(addr *ret);
lisp_compiled_dynamicvoid lisp_compiled_dynamic(int index, lisp_calltype_dynamic call);
入力: index 関数番号
入力: call 関数ポインタ int (*call)(addr)
関数ポインタcallをindex番目に登録します。
indexは0~31までの値であり、
上限値31はdefine値LISP_POINTER_EXTENDで設定できます。
Lispから呼び出されると、引数を&rest指定のようにリストとして第1引数に渡してます。
restと違い、リストはdynamic-extentで確保されるため、
関数の返却値には設定できません。
下記の宣言のような関数が作成されます。
(defun name (&rest args)
(declare (dynamic-extent args)
...)
lisp_compiled_restvoid lisp_compiled_rest(int index, lisp_calltype_rest call);
入力: index 関数番号
入力: call 関数ポインタ int (*call)(addr)
関数ポインタcallをindex番目に登録します。
indexは0~31までの値であり、
上限値31はdefine値LISP_POINTER_EXTENDで設定できます。
Lispから呼び出されると、引数を&rest指定のようにリストとして第1引数に渡してます。
dynamicと違い、リストはheap領域に確保されるため、関数の返却値に設定できます。
下記の宣言のような関数が作成されます。
(defun name (&rest args)
...)
lisp_compiled_emptyvoid lisp_compiled_empty(int index, lisp_calltype_empty call);
入力: index 関数番号
入力: call 関数ポインタ int (*call)(void)
関数ポインタcallをindex番目に登録します。
indexは0~31までの値であり、
上限値31はdefine値LISP_POINTER_EXTENDで設定できます。
Lispからは引数無しで呼び出されます。
引数がある場合はエラーです。
下記の宣言のような関数が作成されます。
(defun name ()
...)
lisp_compiled_var1void lisp_compiled_var1(int index, lisp_calltype_var1 call);
入力: index 関数番号
入力: call 関数ポインタ int (*call)(addr)
関数ポインタcallをindex番目に登録します。
indexは0~31までの値であり、
上限値31はdefine値LISP_POINTER_EXTENDで設定できます。
Lispからは引数1つで呼び出されます。
引数が1つではない場合はエラーです。
下記の宣言のような関数が作成されます。
(defun name (x)
...)
lisp_compiled_var2void lisp_compiled_var2(int index, lisp_calltype_var2 call);
入力: index 関数番号
入力: call 関数ポインタ int (*call)(addr, addr)
関数ポインタcallをindex番目に登録します。
indexは0~31までの値であり、
上限値31はdefine値LISP_POINTER_EXTENDで設定できます。
Lispからは引数2つで呼び出されます。
引数が2つではない場合はエラーです。
下記の宣言のような関数が作成されます。
(defun name (x y)
...)
lisp_compiled_var3void lisp_compiled_var3(int index, lisp_calltype_var3 call);
入力: index 関数番号
入力: call 関数ポインタ int (*call)(addr, addr, addr)
関数ポインタcallをindex番目に登録します。
indexは0~31までの値であり、
上限値31はdefine値LISP_POINTER_EXTENDで設定できます。
Lispからは引数3つで呼び出されます。
引数が3つではない場合はエラーです。
下記の宣言のような関数が作成されます。
(defun name (x y z)
...)
lisp_compiled_function_int lisp_compiled_function_(addr x, int index, addr symbol);
入力: index 関数番号
入力: symbol symbolオブジェクトかNULL
戻り値: 脱出時は0以外
関数オブジェクトを生成します。
関数内部で保有する名前はsymbolに指定します。
symbolがNULLの場合はNILがを使用します。
symbolがhold変数の場合は、内容を使用します。
オブジェクトが呼び出されると、関数番号に登録した関数ポインタが実行されます。
lisp_compiled_function8_int lisp_compiled_function8_(addr x, int index, const void *str);
int lisp_compiled_function16_(addr x, int index, const void *str);
int lisp_compiled_function32_(addr x, int index, const void *str);
入力: index 関数番号
入力: str Unicode文字列
戻り値: 脱出時は0以外
関数オブジェクトを生成します。
関数内部で保有する名前はstrに指定します。
オブジェクトが呼び出されると、関数番号に登録した関数ポインタが実行されます。
Unicode文字列の詳細はlisp_string8_関数をご確認ください。
lisp_compiled_function16_lisp_compiled_function8_で解説
lisp_compiled_function32_lisp_compiled_function8_で解説
lisp_compiled_defun_int lisp_compiled_defun_(int index, addr symbol);
入力: index 関数番号
入力: symbol symbolオブジェクト
戻り値: 脱出時は0以外
関数を登録します。
オブジェクトを生成してsymbol-functionに登録します。
symbolがhold変数の場合は、内容を使用します。
生成された関数が呼び出されると、関数番号に登録した関数ポインタが実行されます。
lisp_compiled_defun8_int lisp_compiled_defun8_(int index, const void *str);
int lisp_compiled_defun16_(int index, const void *str);
int lisp_compiled_defun32_(int index, const void *str);
入力: index 関数番号
入力: str Unicode文字列
戻り値: 脱出時は0以外
関数を登録します。
オブジェクトを生成してsymbol-functionに登録します。
生成された関数が呼び出されると、関数番号に登録した関数ポインタが実行されます。
Unicode文字列の詳細はlisp_string8_関数をご確認ください。
lisp_compiled_defun16_lisp_compiled_defun8_で解説
lisp_compiled_defun32_lisp_compiled_defun8_で解説
lisp_compiled_defun_setf_int lisp_compiled_defun_setf_(int index, addr symbol);
入力: index 関数番号
入力: symbol symbolオブジェクト
戻り値: 脱出時は0以外
symbolのsetf関数を登録します。
symbolがhold変数の場合は、内容を使用します。
生成された関数が呼び出されると、関数番号に登録した関数ポインタが実行されます。
lisp_compiled_defun_setf8_int lisp_compiled_defun_setf8_(int index, const void *str);
int lisp_compiled_defun_setf16_(int index, const void *str);
int lisp_compiled_defun_setf32_(int index, const void *str);
入力: index 関数番号
入力: str Unicode文字列
戻り値: 脱出時は0以外
symbolのsetf関数を登録します。
生成された関数が呼び出されると、関数番号に登録した関数ポインタが実行されます。
Unicode文字列の詳細はlisp_string8_関数をご確認ください。
lisp_compiled_defun_setf16_lisp_compiled_defun_setf8_で解説
lisp_compiled_defun_setf32_lisp_compiled_defun_setf8_で解説
lisp_compiled_getvaluevoid lisp_compiled_getvalue(addr *ret);
出力: ret オブジェクト返却
クロージャーから値を取得します。
値はスタックフレームから取得しますので、
取得前にlisp_push_controlを使用しないでください。
lisp_compiled_setvaluevoid lisp_compiled_setvalue(addr pos, addr value);
入力: pos 関数オブジェクト
入力: value オブジェクトかNULL
関数オブジェクトのクロージャーに値を設定します。
valueがNULLの場合はNILが使用されます。
valueがhold変数の場合は、内容が使用されます。