5 補助ライブラリ
補助ライブラリ (auxiliary library) は C と Lua の対話のための便利な関数を提供します。C と Lua の対話に使える機能は § 4 で説明した基礎 API が全てですが、補助ライブラリには一般的なタスクのための高レベルな関数が用意されています。
補助ライブラリに含まれる関数と型は全てヘッダーファイル luaxlib.h
に定義されており、接頭辞 luaL_
を持ちます。
補助ライブラリに含まれる全ての関数は基礎 API の上に作られています。そのため補助ライブラリで行えることは全て基礎 API を使っても行えます。ただそれでも、補助ライブラリを使えばコードがより一貫したものになります。
補助ライブラリに含まれる関数の中にはスタックのスロットを内部で使うものがあります。補助ライブラリの関数が使うスロットが 5 個未満の場合、その関数はスタックサイズを確認しません。スロットは十分にあるものとして処理が行われます。
補助ライブラリには C 関数の引数を確認する関数がいくつかあります。エラーメッセージは引数を使って (例えば "bad argument #1"
のように) フォーマットされるので、こういった関数を引数でない値がスタックに積まれた状態で呼び出すべきではありません。
luaL_check*
を呼んだ関数は条件が確認できなかったとき必ずエラーを送出します。
5.1 関数と型
補助ライブラリに含まれる全ての関数と型を辞書順に示します。
luaL_addchar
void luaL_addchar (luaL_Buffer *B, char c);
バイト c
をバッファ B
に加えます (参照: luaL_Buffer
)。
luaL_addgsub
const void luaL_addgsub (luaL_Buffer *B,
const char *s,
const char *p,
const char *r);
文字列 s
をコピーし、コピーに含まれる文字列 p
を全て r
に置換し、それをバッファ B
に加えます (参照: luaL_Buffer
)。
luaL_addlstring
void luaL_addlstring (luaL_Buffer *B, const char *s, size_t l);
s
が指す長さ l
の文字列をバッファ B
に加えます (参照: luaL_Buffer
)。文字列の中にゼロ文字が含まれていても構いません。
luaL_addsize
void luaL_addsize (luaL_Buffer *B, size_t n);
バッファ B
の長さを n
だけ伸ばします。ここで n
は直前にバッファに追加された文字列の長さです (参照: luaL_prepbuffer
)。
luaL_addstring
void luaL_addstring (luaL_Buffer *B, const char *s);
s
が指すゼロ終端文字列をバッファ B
に加えます (参照: luaL_Buffer
)。
luaL_addvalue
void luaL_addvalue (luaL_Buffer *B);
スタックトップにある値をバッファ B
に加え、その値をポップします (参照: luaL_Buffer
)。
これは文字列バッファを使う関数の中で唯一スタックを利用できる (必ず利用しなければならない) 関数です。スタックトップの値がバッファに加えられます。
luaL_argcheck
void luaL_argcheck (lua_State *L,
int cond,
int arg,
const char *extramsg);
cond
が true であること確認します。もし cond
が false なら標準的なメッセージと共にエラーを送出します (参照: luaL_argerror
)。
luaL_argerror
int luaL_argerror (lua_State *L, int arg, const char *extramsg);
この関数を呼び出した C 関数に与えられた arg
番目の引数に問題があることを報告するエラーを送出します。エラーメッセージには次の標準的なメッセージに extramsg
を付けた文字列が使われます:
bad argument #arg to 'funcname' (extramsg)
この関数は返りません。
luaL_argexpected
void luaL_argexpected (lua_State *L
int cond
int arg
const char *tname);
cond
が true であることを確認します。もし cond
が false なら arg
番目の引数の型が間違っていることを示すエラーを標準的なメッセージと共に送出します (参照: luaL_typeerror
)。
luaL_Buffer
typedef struct luaL_Buffer luaL_Buffer;
文字列バッファ (string buffer) の型です。
文字列バッファを使うと、C コードから Lua の文字列を少しずつ構築できます。文字列バッファは次のように使います:
-
luaL_Buffer
型の変数b
を宣言する。 -
luaL_buffinit(L, &b)
でb
を初期化する。 - いずれかの
luaL_add*
関数を使ってバッファを少しずつ構築する。 - 最後に
luaL_pushresult(&b)
を呼ぶ。これで最終的な文字列がスタックトップに載る。
構築する文字列の最大サイズが事前に分かっている場合には、バッファの構築は次のようできます:
-
luaL_Buffer
型の変数b
を宣言する。 -
luaL_buffinitsize(L, &b, sz)
を呼んで、b
をサイズsz
で初期化する。 - 確保された空間に文字列を生成する。
- 最後に
luaL_pushresultsize(&b, sz)
を呼ぶ。sz
はコピーされた文字列の全長であり、確保されたサイズより小さくても構わない。
文字列バッファを操作する関数は通常の実行で可変個数のスタックスロットを使用します。そのためバッファを使っている間はスタックトップが変わらないと仮定してはいけません。連続するバッファ操作の間でスタックを使っても構いませんが、そのときは「バランスを取って」使わなければなりません: つまり二回目以降のバッファ操作が始まるときのスタックは前回のバッファ操作直後と同じ高さである必要があります (この規則に対する唯一の例外は luaL_addvalue
です)。luaL_pushresult
を呼ぶとスタックはバッファを初期化したときの状態に戻り、そこに最終的な文字列がプッシュされます。
luaL_buffaddr
char *luaL_buffaddr (luaL_Buffer *B);
バッファ B
の現在時点における内容を指すアドレスを返します (参照: luaL_Buffer
)。この関数を呼び出した後バッファにデータを加えると、返り値のアドレスが有効でなくなる可能性があります。
luaL_buffinit
void luaL_buffinit (lua_State *L, luaL_Buffer *B);
バッファ B
を初期化します (参照: luaL_Buffer
)。この関数は B
のための空間を確保しないので、B
は luaL_Buffer
型の変数として宣言される必要があります。
luaL_bufflen
size_t luaL_bufflen (luaL_Buffer *B);
バッファ B
の内容の現時点における長さを返します (参照: luaL_Buffer
)。
luaL_buffinitsize
char *luaL_buffinitsize (lua_State *L, luaL_Buffer *B, size_t sz);
luaL_buffinit
と luaL_prepbuffsize
を続けて呼ぶのと等価です。
luaL_buffsub
void luaL_buffsub (luaL_Buffer *B, int n);
バッファ B
から n
バイトを削除します (参照: luaL_Buffer
)。バッファのサイズは最低でも n
バイトである必要があります。
luaL_callmeta
int luaL_callmeta (lua_State *L, int obj, const char *e);
メタメソッドを呼び出します。
スタックのインデックス obj
にあるオブジェクトがメタテーブルを持ち、そのメタテーブルにキーが e
のフィールドがあるなら、この関数はインデックス obj
にあるオブジェクトを唯一の引数としてそのフィールドのバリューを呼び出します。メタメソッドを呼び出した場合この関数は true を返し、スタックに呼び出しの返り値をプッシュします。メタテーブルまたはメタメソッドが見つからなかった場合には、この関数はスタックに何もプッシュせずに false を返します。
luaL_checkany
void luaL_checkany (lua_State *L, int arg);
関数がスタックの位置 arg
に引数を持つことを確認します。型は確認しません (nil でも構いません)。
luaL_checkinteger
lua_Integer luaL_checkinteger (lua_State *L, int arg);
関数の arg
番目の引数が整数 (あるいは整数に変換できる値) であることを確認し、その整数を返します。
luaL_checklstring
const char *luaL_checklstring (lua_State *L, int arg, size_t *l);
関数の arg
番目の引数が文字列であることを確認し、その文字列を返します。l
が NULL
でなければ、*l
に文字列の長さを代入します。
この関数は lua_tolstring
を使って結果を計算します。そのため lua_tolstring
で説明した注意事項がここでも当てはまります。
luaL_checknumber
lua_Number luaL_checknumber (lua_State *L, int arg);
関数の arg
番目の引数が数値であることを確認し、それを lua_Number
に変換した値を返します。
luaL_checkoption
int luaL_checkoption (lua_State *L,
int arg,
const char *def,
const char *const lst[]);
関数の arg
番目の引数が文字列であることを確認し、その文字列を lst
の中から検索します。lst
にある文字列はゼロ終端文字列です。検索対象の文字列の配列におけるインデックスを返します。引数が文字列でない、あるいは文字列が見つからない場合にはエラーを送出します。
def
が NULL
でない場合、この関数は arg
番目の引数が見つからないときおよび nil であるときにデフォルト値として def
を返します。
この関数は文字列を C の列挙体にマッピングするとき使うことができます。通常 Lua ライブラリではオプションの選択に数値ではなく文字列を使うようになっています。
luaL_checkstack
void luaL_checkstack (lua_State *L, int sz, const char *msg);
スタックのサイズを (現在のトップ) + sz
要素に伸ばします。そのサイズに伸ばせなければエラーを送出します。msg
はエラーメッセージに表示する追加テキストです (追加テキストがなければ NULL
とします)。
luaL_checkstring
const char *luaL_checkstring (lua_State *L, int arg);
関数の arg
番目の引数が文字列であることを確認し、その文字列を返します。
この関数は lua_tolstring
を使って結果を計算します。そのため lua_tolstring
で説明した注意事項がここでも当てはまります。
luaL_checktype
void luaL_checktype (lua_State *L, int arg, int t);
関数の arg
番目の引数が t
型であることを確認します。型を int
にエンコードする方法は lua_type
を参照してください。
luaL_checkudata
void *luaL_checkudata (lua_State *L, int arg, const char *tname);
関数の arg
番目の引数が tname
型 (参照: luaL_newmetatable
) のユーザーデータであることを確認し、そのメモリ領域を指すアドレスを返します1 (参照: lua_touserdata
)。
luaL_checkversion
void luaL_checkversion (lua_State *L);
呼び出されている Lua ライブラリとそれを呼び出しているコードが、同じバージョンの Lua と同じ数値型を使っていることを確認します。
luaL_dofile
int luaL_dofile (lua_State *L, const char *filename);
指定された名前のファイルをロードして実行します。次のマクロとして定義されます:
(luaL_loadfile(L, filename) || lua_pcall(L, 0, LUA_MULTRET, 0))
(参照: luaL_loadfile
, lua_pcall
)
エラーがなければ LUA_OK
が返り、エラーがあればエラーコードが返ります (§ 4.4.1)。
luaL_dostring
int luaL_dostring (lua_State *L, const char *str);
指定された文字列をロードして実行します。次のマクロとして定義されます:
(luaL_loadstring(L, str) || lua_pcall(L, 0, LUA_MULTRET, 0))
(参照 luaL_loadfile
, lua_pcall
)
エラーがなければ LUA_OK
が返り、エラーがあればエラーコードが返ります (§ 4.4.1)。
luaL_error
int luaL_error (lua_State *L, const char *fmt, ...);
エラーを送出します。エラーメッセージのフォーマットは fmt
とそれ以降の引数で与えられます。フォーマットの規則は lua_pushfstring
と同様です。メッセージの最初にはエラーが発生したファイル名と行番号が (取得可能なら) 付け足されます。
この関数は返りませんが、C 関数で使うときは return luaL_error(args)
とするのがイディオムとなっています。
luaL_execresult
int luaL_execresult (lua_State *L, int stat);
プロセスに関する標準ライブラリ関数 (os.execute
と io.close
) 用の返り値を生成します。
luaL_fileresult
int luaL_fileresult (lua_State *L, int stat, const char *fname);
ファイルに関する標準ライブラリ関数 (io.open
, os.rename
, file:seek
など) 用の返り値を生成します。
luaL_getmetafield
int luaL_getmetafield (lua_State *L, int obj, const char *e);
スタックのインデックス obj
にあるオブジェクトのメタテーブルの e
というフィールドをスタックにプッシュし、プッシュした値の型を返します。このインデックスにあるオブジェクトがメタテーブルを持たない場合、およびメタテーブルに指定したフィールドがない場合には、何もプッシュせずに LUA_TNIL
を返します。
luaL_getmetatable
int luaL_getmetatable (lua_State *L, const char *tname);
レジストリで tname
という名前に関連付いたメタテーブルをスタックにプッシュします (参照: luaL_newmetatable
)。tname
という名前に関連付いたメタテーブルが存在しない場合には nil をプッシュします。返り値はプッシュされた値の型です。
luaL_getsubtable
int luaL_getsubtable (lua_State *L, int idx, const char *fname);
スタックのインデックス idx
にある値 t
に対して、t[fname]
がテーブルであることを確認し (存在しないなら新しく作成し)、t[fname]
をスタックにプッシュします。テーブルが存在したなら true を返し、新しくテーブルを作ったのなら false を返します。
luaL_gsub
const char *luaL_gsub (lua_State *L,
const char *s,
const char *p,
const char *r);
文字列 s
をコピーし、コピーに含まれる文字列 p
を全て文字列 r
で置き換え、置換結果をスタックにプッシュしてそれを返します。
luaL_len
lua_Integer luaL_len (lua_State *L, int index);
指定されたインデックスにある値の「長さ」を数値として返します。Lua の #
演算子 (§ 3.4.7) と等価です。演算結果が整数でない場合にはエラーを送出します (このエラーが起こるのはメタメソッドを呼び出したときだけです)。
luaL_loadbuffer
int luaL_loadbuffer (lua_State *L,
const char *buff,
size_t sz,
const char *name);
mode
を NULL
とした luaL_loadbufferx
と等価です。
luaL_loadbufferx
int luaL_loadbufferx (lua_State *L,
const char *buff,
size_t sz,
const char *name,
const char *mode);
バッファを Lua チャンクとしてロードします。この関数は lua_load
を使って buff
が指すサイズ sz
のバッファをチャンクとしてロードします。
この関数の返り値は lua_load
と同様です。name
はチャンクの名前であり、デバッグ情報やエラーメッセージで使われます。パラメータの文字列 mode
は lua_load
と同様です。
luaL_loadfile
int luaL_loadfile (lua_State *L, const char *filename);
mode
を NULL
とした luaL_loadfilex
と等価です。
luaL_loadfilex
int luaL_loadfilex (lua_State *L
const char *filename
const char *mode);
ファイルを Lua チャンクとして読み込みます。filename
という名前のファイルにあるチャンクが lua_load
を使って読み込まれます。filename
が NULL
のときは標準入力からチャンクを読み込みます。入力の最初の行が #
で始まる場合、その行は無視されます。
文字列の引数 mode
は lua_load
と同様です。
ファイルに関するエラーがあれば LUA_ERRFILE
が返り、無ければ lua_load
と同じ返り値が返ります。
lua_load
と同様、この関数はチャンクを読み込むだけで実行はしません。
luaL_loadstring
int luaL_loadstring (lua_State *L, const char *s);
文字列を Lua チャンクとして読み込みます。ゼロ終端文字列 s
に含まれるチャンクが lua_load
を使って読み込まれます。
この関数は lua_load
と同じ返り値を返します。
lua_load
と同様、この関数はチャンクを読み込むだけで実行はしません。
luaL_newlib
void luaL_newlib (lua_State *L, const luaL_Reg l[]);
新しいテーブルを作り、それにリスト l
に含まれる関数を登録します。
この関数は次のマクロとして実装されます:
(luaL_newlibtable(L,l), luaL_setfuncs(L,l,0))
配列 l
は本当の配列である必要があり、ポインタを使うことはできません。
luaL_newlibtable
void luaL_newlibtable (lua_State *L, const luaL_Reg l[]);
配列 l
に含まれるエントリーが全て収まるよう最適化されたサイズを持つテーブルを新しく作成します (ただしエントリーの保存はしません)。この関数は luaL_setfuncs
と一緒に使われることが想定されています (参照: luaL_newlib
)。
この関数はマクロとして実装されます。配列 l
は本当の配列である必要があり、ポインタを使うことはできません。
luaL_newmetatable
int luaL_newmetatable (lua_State *L, const char *tname);
レジストリが tname
というキーを持つなら 0 を返します。そうでなければ、ユーザーデータのメタテーブルとして使うテーブルを新しく作成し、このテーブルに __name = tname
というペアを追加し、レジストリに [tname] = new table
というペアを追加し、1 を返します (参照: luaL_checkudata
)。
両方の場合において、レジストリの tname
に結び付いた最終的な値をスタックにプッシュします。
luaL_newstate
lua_State *luaL_newstate (void);
新しい Lua ステートを作成します。この関数は lua_newstate
を呼び出しますが、そのとき C の標準メモリアロケーション関数を利用し、エラーメッセージを標準エラー出力に書き出す関数をパニック関数 (§ 4.4) および警告関数として設定します。
成功すれば新しいステートを返します。メモリアロケーションでエラーがあれば NULL
を返します。
luaL_openlibs
void luaL_openlibs (lua_State *L);
全ての Lua 標準ライブラリを与えられたステートで開きます。
luaL_opt
T luaL_opt (L, func, arg, dflt);
このマクロは次のように定義されます:
(lua_isnoneornil(L,(arg)) ? (dflt) : func(L,(arg)))
言葉を使って説明すると、もし現在実行している関数の arg
番目の引数が nil または存在しない値であれば、このマクロはデフォルト値 dflt
を返します。そうでなければ func
を ステート L
と引数のインデックス arg
を使って呼び出します。式 dflt
の評価は必要な場合にだけ起こることに注意してください。
luaL_optinteger
lua_Integer luaL_optinteger (lua_State *L, int arg, lua_Integer d);
現在実行している関数の arg
番目の引数が整数 (もしくは整数に変換できる値) ならその整数を返し、この引数が存在しないか nil なら d
を返します。それ以外の場合にはエラーを送出します。
luaL_optlstring
const char *luaL_optlstring (lua_State *L,
int arg,
const char *d,
size_t *l);
現在実行している関数の arg
番目の引数が文字列ならその文字列を返し、この引数が存在しないか nil なら d
を返します。それ以外の場合にはエラーを送出します。
l
が NULL
でない場合、*l
に返り値の文字列の長さが代入されます。返り値が NULL
のとき (つまり d
が NULL
で d
を返しているとき) は長さが 0 とみなされます。
この関数は返り値の計算に lua_tolstring
を使うので、lua_tolstring
で説明した注意事項がここでも当てはまります。
luaL_optnumber
lua_Number luaL_optnumber (lua_State *L, int arg, lua_Number d);
現在実行している関数の arg
番目の引数が数値なら、それを lua_Number
として返します。この引数が存在しないか nil の場合には d
を返します。それ以外の場合にはエラーを送出します。
luaL_optstring
const char *luaL_optstring (lua_State *L, int arg, const char *d);
現在実行している関数の arg
番目の引数が文字列ならその文字列を返し、この引数が存在しないか nil なら d
を返します。それ以外の場合にはエラーを送出します。
luaL_prepbuffer
char *luaL_prepbuffer (luaL_Buffer *B);
size
を定数 LUAL_BUFFERSIZE
とした luaL_prepbuffsize
と等価です。
luaL_prepbuffsize
char *luaL_prepbuffsize (luaL_Buffer *B, size_t sz);
バッファ B
に加える文字列をコピーするためのサイズ sz
のメモリ領域のアドレスを返します (参照: luaL_Buffer
)。この領域にコピーした文字列を実際にバッファに加えるには、加えた文字列のサイズと共に luaL_addsize
を呼び出す必要があります。
luaL_pushfail
void luaL_pushfail (lua_State *L);
fail をスタックにプッシュします (参照: § 6)。
luaL_pushresult
void luaL_pushresult (luaL_Buffer *B);
バッファ B
の利用を終了し、最終的な文字列をスタックにプッシュします。
luaL_pushresultsize
void luaL_pushresultsize (luaL_Buffer *B, size_t sz);
luaL_addsize
と luaL_pushresult
を続けて実行するのと等価です。
luaL_ref
int luaL_ref (lua_State *L, int t);
参照 (reference) を作って返します。この参照はスタックのインデックス t
にあるテーブルに作成され、スタックトップにあるオブジェクトを指します (このオブジェクトはスタックからポップされます)。
参照とはユニークな整数キーのことです。t
にあるテーブルに対して整数のキーを個別に追加しない限り、luaL_ref
が返す整数はユニークであることが保証されます。参照 r
が指すオブジェクトは lua_rawgeti(L, t, r)
で取得できます。参照の解放には luaL_unref
を使います。
スタックトップにある値が nil である場合、luaL_ref
は定数 LUA_REFNIL
を返します。また定数 LUA_NOREF
は luaL_ref
が返すどんな参照とも異なることが保証されています。
luaL_Reg
typedef struct luaL_Reg {
const char *name;
lua_CFunction func;
} luaL_Reg;
luaL_setfuncs
で登録するときに使う関数の配列の型です。name
は関数の名前で、func
は関数へのポインタを表します。luaL_Reg
の配列を使うときは、name
と func
を両方 NULL
とした「門番」要素を配列の最後の要素とする必要があります。
luaL_requiref
void luaL_requiref (lua_State *L,
const char *modname,
lua_CFunction openf,
int glb);
package.loaded[modname]
が true でなければ、modname
を引数として openf
関数を呼び出し、その結果を package.loaded[modname]
に代入します。これにより require
を通して openf
を呼び出したような処理が行われます。
glb
が true なら、読み込んだモジュールをグローバル変数 modname
として保存します。
この関数はモジュールのコピーがスタックに残った状態で返ります。
luaL_setfuncs
void luaL_setfuncs (lua_State *L, const luaL_Reg *l, int nup);
配列 l
に含まれる全ての関数 (参照: luaL_Reg
) をスタックトップにあるテーブルに登録します。ただし次に説明するように、テーブルの上にアップバリューを配置することもできます。
nup
が 0 でない場合、全ての関数は nup
個のアップバリューと共に作成されます。アップバリューの初期値にはスタックでライブラリテーブルの上にプッシュされた値が使われます。これらの値は登録処理の後スタックからポップされます。
luaL_setmetatable
void luaL_setmetatable (lua_State *L, const char *tname);
スタックトップにあるオブジェクトのメタテーブルを、レジストリで tname
という名前に関連付いたメタテーブルに設定します (参照: luaL_newmetatable
)。
luaL_Stream
typedef struct luaL_Stream {
FILE *f;
lua_CFunction closef;
} luaL_Stream;
標準 I/O ライブラリで使われるファイルハンドルの標準的なデータ表現です。
ファイルハンドルは LUA_FILEHANDLE
という名前のメタテーブルを持ったフルユーザーデータとして実装されます (LUA_FILEHANDLE
はマクロであり、展開した文字列が実際のメタテーブルの名前です)。このメタテーブルは I/O ライブラリによってレジストリに作成されます (参照: luaL_newmetatable
)。
ファイルハンドルを表すこのユーザーデータは luaL_Stream
構造体の値を一つ目のユーザーバリューとして持つ必要があり、それ以外のデータを持つことはできません。フィールド f
は対応する C ストリーム (不完全に作成されたハンドルでは NULL
) を指します。フィールド closef
はストリームをクローズする関数であり、ハンドルがクローズあるいはコレクトされるときに呼ばれます。closef
は唯一の引数としてファイルハンドルを受け取り、成功したときには true を、エラーのときは false とエラーメッセージを返さなければなりません。Lua は closef
を呼んだ後ハンドルがクローズされたことが分かるように f
を NULL
に設定します。
luaL_testudata
void *luaL_testudata (lua_State *L, int arg, const char *tname);
この関数の動作は基本的に luaL_checkudata
と同じですが、判定が通らなかった時にエラーを送出するのではなく NULL
を返す点が唯一異なります。
luaL_tolstring
const char *luaL_tolstring (lua_State *L, int idx, size_t *len);
与えられたインデックスにある任意の Lua の値を意味の通った C 文字列に変換します。処理結果の文字列はスタックにプッシュされ、関数の返り値としても返ります。len
が NULL
でなければ、*len
に文字列の長さが代入されます。
変換される値がメタテーブルを持ち、メタテーブルが __tostring
フィールドを持つなら、luaL_tolstring
は変換される値を引数として __tostring
フィールドに対応するメタメソッドを呼び、その結果を返り値とします
luaL_traceback
void luaL_traceback (lua_State *L,
lua_State *L1,
const char *msg,
int level);
スタック L1
のトレースバックを作成し、スタックにプッシュします。msg
が NULL
でなければ、それがトレースバックの先頭に加えられます。level
パラメータはトレースバックを始めるレベルを指定します。
luaL_typeerror
const char *luaL_typeerror (lua_State *L,
int arg,
const char *tname);
この関数を呼び出した C 関数に渡された arg
番目の引数に関する型エラーを送出します。標準的なメッセージが使われます。tname
は期待される型の「名前」です。この関数は返りません。
luaL_typename
const char *luaL_typename (lua_State *L, int index);
スタックの与えられたインデックスにある値の型の名前を返します。
luaL_unref
void luaL_unref (lua_State *L, int t, int ref);
スタックのインデックス t
にあるテーブルの参照 ref
を解放します (参照: luaL_ref
)。指定されたエントリーはテーブルから削除され、参照されていたオブジェクトはコレクトできるようになります。ref
という参照も解放され、再利用が可能になります。
ref
が LUA_NOREF
と LUA_REFNIL
の場合には、luaL_unref
は何もしません。
luaL_where
void luaL_where (lua_State *L, int lvl);
コールスタックのレベル lvl
における現在の制御位置を説明する文字列をスタックにプッシュします。通常この文字列は次のフォーマットをしています:
chunkname:currentline:
レベル 0 は現在実行中の関数で、レベル 1 はそれを呼び出した関数を表します。
この関数はエラーメッセージの先頭部分を作るのに使われます。
-
訳注: 引数
tname
は Lua の型ではなく C の型を表す (識別する) 任意の文字列である。luaL_checkudata
関数は C で定義された型の値を Lua のユーザーデータとして型検査と共に使うために利用される。リファレンスマニュアルにはこの使い方についての記述が存在しないが、Programming in Lua (first edition) の第二十八章に解説がある。[return]