関数仕様 - 関数

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);

■function

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_function

void 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_setf

void 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_で解説

■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);

関数lisp_compiled_dynamic

void lisp_compiled_dynamic(int index, lisp_calltype_dynamic call);

入力: index 関数番号
入力: call 関数ポインタ int (*call)(addr)

関数ポインタcallindex番目に登録します。
indexは0~31までの値であり、 上限値31はdefine値LISP_POINTER_EXTENDで設定できます。

Lispから呼び出されると、引数を&rest指定のようにリストとして第1引数に渡してます。
restと違い、リストはdynamic-extentで確保されるため、 関数の返却値には設定できません。

下記の宣言のような関数が作成されます。

(defun name (&rest args)
  (declare (dynamic-extent args)
  ...)

関数lisp_compiled_rest

void lisp_compiled_rest(int index, lisp_calltype_rest call);

入力: index 関数番号
入力: call 関数ポインタ int (*call)(addr)

関数ポインタcallindex番目に登録します。
indexは0~31までの値であり、 上限値31はdefine値LISP_POINTER_EXTENDで設定できます。

Lispから呼び出されると、引数を&rest指定のようにリストとして第1引数に渡してます。
dynamicと違い、リストはheap領域に確保されるため、関数の返却値に設定できます。

下記の宣言のような関数が作成されます。

(defun name (&rest args)
  ...)

関数lisp_compiled_empty

void lisp_compiled_empty(int index, lisp_calltype_empty call);

入力: index 関数番号
入力: call 関数ポインタ int (*call)(void)

関数ポインタcallindex番目に登録します。
indexは0~31までの値であり、 上限値31はdefine値LISP_POINTER_EXTENDで設定できます。

Lispからは引数無しで呼び出されます。
引数がある場合はエラーです。

下記の宣言のような関数が作成されます。

(defun name ()
  ...)

関数lisp_compiled_var1

void lisp_compiled_var1(int index, lisp_calltype_var1 call);

入力: index 関数番号
入力: call 関数ポインタ int (*call)(addr)

関数ポインタcallindex番目に登録します。
indexは0~31までの値であり、 上限値31はdefine値LISP_POINTER_EXTENDで設定できます。

Lispからは引数1つで呼び出されます。
引数が1つではない場合はエラーです。

下記の宣言のような関数が作成されます。

(defun name (x)
  ...)

関数lisp_compiled_var2

void lisp_compiled_var2(int index, lisp_calltype_var2 call);

入力: index 関数番号
入力: call 関数ポインタ int (*call)(addr, addr)

関数ポインタcallindex番目に登録します。
indexは0~31までの値であり、 上限値31はdefine値LISP_POINTER_EXTENDで設定できます。

Lispからは引数2つで呼び出されます。
引数が2つではない場合はエラーです。

下記の宣言のような関数が作成されます。

(defun name (x y)
  ...)

関数lisp_compiled_var3

void lisp_compiled_var3(int index, lisp_calltype_var3 call);

入力: index 関数番号
入力: call 関数ポインタ int (*call)(addr, addr, addr)

関数ポインタcallindex番目に登録します。
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以外

symbolsetf関数を登録します。
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以外

symbolsetf関数を登録します。
生成された関数が呼び出されると、関数番号に登録した関数ポインタが実行されます。
Unicode文字列の詳細はlisp_string8_関数をご確認ください。

脱出関数lisp_compiled_defun_setf16_

lisp_compiled_defun_setf8_で解説

脱出関数lisp_compiled_defun_setf32_

lisp_compiled_defun_setf8_で解説

関数lisp_compiled_getvalue

void lisp_compiled_getvalue(addr *ret);

出力: ret オブジェクト返却

クロージャーから値を取得します。
値はスタックフレームから取得しますので、 取得前にlisp_push_controlを使用しないでください。

関数lisp_compiled_setvalue

void lisp_compiled_setvalue(addr pos, addr value);

入力: pos 関数オブジェクト
入力: value オブジェクトかNULL

関数オブジェクトのクロージャーに値を設定します。
valueがNULLの場合はNILが使用されます。
valueがhold変数の場合は、内容が使用されます。