% 関数仕様 - シーケンス
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_consvoid lisp_cons(addr x, addr car, addr cdr);
入力: car, cdr オブジェクト
出力: x hold変数
consオブジェクトを生成します。
carがNULLの場合はNILが指定されます。
cdrがNULLの場合はNILが指定されます。
carがhold変数の場合は、内容が指定されます。
cdrがhold変数の場合は、内容が指定されます。
lisp_vectorvoid lisp_vector(addr x, size_t size);
入力: size 配列の長さ
出力: x hold変数
一次元の配列オブジェクトを生成します。
simple-vector型の専用オブジェクトです。
lisp_listvoid 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_listavoid 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以外
シーケンスposのindex番目の要素を返却します。
posがhold変数の場合は、内容が使用されます。
lisp_setelt_int lisp_setelt_(addr pos, size_t index, addr value);
入力: pos シーケンス
入力: index インデックス
出力: x hold変数
戻り値: 脱出時は0以外
シーケンスposのindex番目の要素を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のアクセス関数です。
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_carvoid lisp_car(addr x, addr list);
入力: list リスト
出力: x hold変数
listのcarを取得します。
listはconsかNILを指定できます。
lisp_cdrvoid lisp_cdr(addr x, addr list);
入力: list リスト
出力: x hold変数
listのcdrを取得します。
listはconsかNILを指定できます。
lisp_carcdrvoid lisp_carcdr(addr x, addr y, addr list);
入力: `list` リスト
出力: x, y hold変数
listのcarをxに、cdrをyに返却します。
listはconsかNILを指定できます。
lisp_setf_carvoid lisp_setf_car(addr cons, addr value);
入力: cons cons型
入力: value オブジェクト
valueがhold変数の場合は、内容が使用されます。
consのcar部にvalueを設定します。
lisp_setf_cdrvoid lisp_setf_cdr(addr cons, addr value);
入力: cons cons型
入力: value オブジェクト
valueがhold変数の場合は、内容が使用されます。
consのcdr部にvalueを設定します。
lisp_setf_carcdrvoid lisp_setf_carcdr(addr cons, addr car, addr cdr);
入力: cons cons型
入力: car, cdr オブジェクト
car, cdrがhold変数の場合は、内容が使用されます。
consのcar部にcarを設定します。
consのcdr部に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);
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変数の場合は、内容を使用します。
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_getcint 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_lengthint lisp_strvect_length(addr pos, size_t *ret);
入力: pos オブジェクト
出力: ret 文字列の長さ
戻り値: 正常終了は0、エラーは0以外
strvectオブジェクトから文字列の長さを取得します。
本関数は脱出なしで文字列から長さを取得するための関数です。
lisp_length_と違いstrvectオブジェクトのみに対応しています。
もしstrvect型オブジェクトではない場合は戻り値-1で終了します。
文字列の長さをretに返却したら、戻り値0で終了します。