関数仕様 - シーケンス

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

関数仕様

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

■シーケンス生成
void lisp_cons(addr x, addr car, addr cdr);
void lisp_vector(addr x, size_t size);
void lisp_list(addr x, ...);
void lisp_lista(addr x, ...);

■シーケンス操作
int lisp_getelt_(addr x, addr pos, size_t index);
int lisp_setelt_(addr pos, size_t index, addr value);
int lisp_length_(addr pos, size_t *ret);

int lisp_reverse_(addr x, addr pos);
int lisp_nreverse_(addr x, addr pos);

■cons
void lisp_car(addr x, addr list);
void lisp_cdr(addr x, addr list);
void lisp_carcdr(addr x, addr y, addr list);

void lisp_setf_car(addr cons, addr value);
void lisp_setf_cdr(addr cons, addr value);
void lisp_setf_carcdr(addr cons, addr car, addr cdr);

■string
int lisp_string8_(addr x, const void *str);
int lisp_string16_(addr x, const void *str);
int lisp_string32_(addr x, const void *str);
int lisp_string_getc_(addr pos, size_t i, unicode *c);

■strvect
int lisp_strvect_getc(addr pos, size_t i, unicode *c);
int lisp_strvect_length(addr pos, size_t *ret);

■シーケンス生成

シーケンスオブジェクトの生成関数です。

void lisp_cons(addr x, addr car, addr cdr);
void lisp_vector(addr x, size_t size);
void lisp_list(addr x, ...);
void lisp_lista(addr x, ...);

関数lisp_cons

void lisp_cons(addr x, addr car, addr cdr);

入力: car, cdr オブジェクト
出力: x hold変数

consオブジェクトを生成します。
carNULLの場合はNILが指定されます。
cdrNULLの場合はNILが指定されます。
carがhold変数の場合は、内容が指定されます。
cdrがhold変数の場合は、内容が指定されます。

関数lisp_vector

void lisp_vector(addr x, size_t size);

入力: size 配列の長さ
出力: x hold変数

一次元の配列オブジェクトを生成します。
simple-vector型の専用オブジェクトです。

関数lisp_list

void lisp_list(addr x, ...);

入力: 可変引数
出力: x hold変数

可変引数を要素にしたlistオブジェクトを生成します。
可変引数はaddrを受け取り、NULLで終端します。
引数がhold変数の場合は、内容を使用します。

例をあげます。

lisp_fixnum(x, 10);
lisp_fixnum(y, 20);
lisp_fixnum(z, 30);
lisp_list(x, x, y, z, NULL);

x -> (10 20 30)

関数lisp_lista

void lisp_lista(addr x, ...);

入力: 可変引数
出力: x hold変数

可変引数を要素にしたlistオブジェクトを生成します。
Common Lispのlist*とほぼ同等であり、最終要素がリストのcdrになります。
可変引数はaddrを受け取り、NULLで終端します。
list*とは違い、要素が一つもない場合はNILを返却します。
引数がhold変数の場合は、内容を使用します。

例をあげます。

lisp_fixnum(x, 10);
lisp_fixnum(y, 20);
lisp_fixnum(z, 30);
lisp_lista(x, x, y, z, NULL);

x -> (10 20 . 30)

■シーケンス操作

シーケンスの操作関数です。

int lisp_getelt_(addr x, addr pos, size_t index);
int lisp_setelt_(addr pos, size_t index, addr value);
int lisp_length_(addr pos, size_t *ret);

int lisp_reverse_(addr x, addr pos);
int lisp_nreverse_(addr x, addr pos);

脱出関数lisp_getelt_

int lisp_getelt_(addr x, addr pos, size_t index);

入力: pos シーケンス
入力: index インデックス
出力: x hold変数
戻り値: 脱出時は0以外

シーケンスposindex番目の要素を返却します。
posがhold変数の場合は、内容が使用されます。

脱出関数lisp_setelt_

int lisp_setelt_(addr pos, size_t index, addr value);


入力: pos シーケンス
入力: index インデックス
出力: x hold変数
戻り値: 脱出時は0以外

シーケンスposindex番目の要素をvalueに設定します。
pos, valueがhold変数の場合は、内容が使用されます。

脱出関数lisp_length_

int lisp_length_(addr pos, size_t *ret);

入力: pos シーケンス
出力: ret 要素数
戻り値: 脱出時は0以外

シーケンスposの要素数を返却します。
posがhold変数の場合は、内容が使用されます。

脱出関数lisp_reverse_

int lisp_reverse_(addr x, addr pos);

入力: pos シーケンス
出力: x hold変数
戻り値: 脱出時に0以外

posを逆順にしたものを返却します。
posがhold変数の場合は、内容が使用されます。
シーケンスは新たに作成されるので、元のシーケンスは破壊しません。

脱出関数lisp_nreverse_

int lisp_nreverse_(addr x, addr pos);

入力: pos シーケンス
出力: x hold変数
戻り値: 脱出時に0以外

posを逆順にしたものを返却します。
posがhold変数の場合は、内容が使用されます。
シーケンスを新たに作成せず、シーケンスを破壊します。

■cons

consのアクセス関数です。

void lisp_car(addr x, addr list);
void lisp_cdr(addr x, addr list);
void lisp_carcdr(addr x, addr y, addr list);

void lisp_setf_car(addr cons, addr value);
void lisp_setf_cdr(addr cons, addr value);
void lisp_setf_carcdr(addr cons, addr car, addr cdr);

関数lisp_car

void lisp_car(addr x, addr list);

入力: list リスト
出力: x hold変数

listのcarを取得します。
listはconsかNILを指定できます。

関数lisp_cdr

void lisp_cdr(addr x, addr list);

入力: list リスト
出力: x hold変数

listのcdrを取得します。
listはconsかNILを指定できます。

関数lisp_carcdr

void lisp_carcdr(addr x, addr y, addr list);

入力: `list` リスト
出力: x, y hold変数

listのcarをxに、cdrをyに返却します。 listはconsかNILを指定できます。

関数lisp_setf_car

void lisp_setf_car(addr cons, addr value);

入力: cons cons型
入力: value オブジェクト

valueがhold変数の場合は、内容が使用されます。
consのcar部にvalueを設定します。

関数lisp_setf_cdr

void lisp_setf_cdr(addr cons, addr value);

入力: cons cons型
入力: value オブジェクト

valueがhold変数の場合は、内容が使用されます。
consのcdr部にvalueを設定します。

関数lisp_setf_carcdr

void lisp_setf_carcdr(addr cons, addr car, addr cdr);

入力: cons cons型
入力: car, cdr オブジェクト

car, cdrがhold変数の場合は、内容が使用されます。
consのcar部にcarを設定します。
consのcdr部にcdrを設定します。

■string

stringのアクセス関数です。

int lisp_string8_(addr x, const void *str);
int lisp_string16_(addr x, const void *str);
int lisp_string32_(addr x, const void *str);
int lisp_string_getc_(addr pos, size_t i, unicode *c);

脱出関数lisp_string8_

int lisp_string8_(addr x, const void *str);
int lisp_string16_(addr x, const void *str);
int lisp_string32_(addr x, const void *str);

入力: str 文字列
出力: x hold変数
戻り値: 脱出時は0以外

stringオブジェクトを返却します。
simple-string型の専用オブジェクトです。
strはオブジェクトに格納する文字列を指定します。
strのメモリ形式は下記の通りです。

脱出関数lisp_string16_

lisp_string8_で解説

脱出関数lisp_string32_

lisp_string8_で解説

脱出関数lisp_string_getc_

int lisp_string_getc_(addr pos, size_t i, unicode *c);

入力: pos 文字列
入力: i インデックス
出力: c 文字
戻り値: 脱出時は0以外

strvectオブジェクトから文字の値を取得します。
posがhold変数の場合は、内容を使用します。

■strvect

simple-string専用のオブジェクトである、strvectの操作関数です。

int lisp_strvect_getc(addr pos, size_t i, unicode *c);
int lisp_strvect_length(addr pos, size_t *ret);

関数lisp_strvect_getc

int lisp_strvect_getc(addr pos, size_t i, unicode *c);

入力: pos オブジェクト
入力: i インデックス
出力: c 文字
戻り値: 正常終了は0、エラーは0以外

strvectオブジェクトから文字の値を取得します。
本関数は脱出なしで文字列から文字を取得するための関数です。

lisp_string_getc_と違いarrayオブジェクトには対応していません。
もしstrvect型オブジェクトではない場合は戻り値-1で終了します。
もしiが文字数を超えていた場合は、戻り値1で終了します。
文字をcに返却したら、戻り値0で終了します。

関数lisp_strvect_length

int lisp_strvect_length(addr pos, size_t *ret);

入力: pos オブジェクト
出力: ret 文字列の長さ
戻り値: 正常終了は0、エラーは0以外

strvectオブジェクトから文字列の長さを取得します。
本関数は脱出なしで文字列から長さを取得するための関数です。

lisp_length_と違いstrvectオブジェクトのみに対応しています。
もしstrvect型オブジェクトではない場合は戻り値-1で終了します。
文字列の長さをretに返却したら、戻り値0で終了します。