# 5 – 輔助庫
_輔助庫_ 提供了一些便捷函數,方便在 C 中為 Lua 編程。 基礎 API 提供了 C 和 Lua 交互用的主要函數, 而輔助庫則為一些常見的任務提供了高階函數。
所有輔助庫中的函數和類型都定義在頭文件 `lauxlib.h` 中, 它們均帶有前綴 `luaL_`。
輔助庫中的所有函數都基于基礎 API 實現。 故而它們并沒有提供任何基礎 API 實現不了的功能。 雖然如此,使用輔助庫可以讓你的代碼更為健壯。
一些輔助庫函數會在內部使用一些額外的棧空間。 當輔助庫使用的棧空間少于五個時, 它們不去檢查棧大小;而是簡單的假設棧夠用。
一些輔助庫中的函數用于檢查 C 函數的參數。 因為錯誤信息格式化為指代參數 (例如,"`bad argument #1`"), 你就不要把這些函數用于參數之外的值了。
如果檢查無法通過, `luaL_check*` 這些函數一定會拋出錯誤。
## 5.1 – 函數和類型
這里我們按字母表次序列出了輔助庫中的所有函數和類型。
### `luaL_addchar`
[-?, +?, _e_]
```
void luaL_addchar (luaL_Buffer *B, char c);
```
向緩存 `B` (參見 [`luaL_Buffer`](#luaL_Buffer) ) 添加一個字節 `c`。
### `luaL_addlstring`
[-?, +?, _e_]
```
void luaL_addlstring (luaL_Buffer *B, const char *s, size_t l);
```
向緩存 `B` (參見 [`luaL_Buffer`](#luaL_Buffer) ) 添加一個長度為 `l` 的字符串 `s`。 這個字符串可以包含零。
### `luaL_addsize`
[-?, +?, _e_]
```
void luaL_addsize (luaL_Buffer *B, size_t n);
```
向緩存 `B` (參見 [`luaL_Buffer`](#luaL_Buffer) ) 添加一個已在之前復制到緩沖區(參見 [`luaL_prepbuffer`](#luaL_prepbuffer)) 的長度為 `n` 的字符串。
### `luaL_addstring`
[-?, +?, _e_]
```
void luaL_addstring (luaL_Buffer *B, const char *s);
```
向緩存 `B` (參見 [`luaL_Buffer`](#luaL_Buffer) ) 添加一個零結尾的字符串 `s`。
### `luaL_addvalue`
[-1, +?, _e_]
```
void luaL_addvalue (luaL_Buffer *B);
```
向緩存 `B` (參見 [`luaL_Buffer`](#luaL_Buffer) ) 添加棧頂的一個值,隨后將其彈出。
這個函數是操作字符串緩存的函數中,唯一一個會(且必須)在棧上放置額外元素的。 這個元素將被加入緩存。
### `luaL_argcheck`
[-0, +0, _v_]
```
void luaL_argcheck (lua_State *L,
int cond,
int arg,
const char *extramsg);
```
檢查 `cond` 是否為真。 如果不為真,以標準信息形式拋出一個錯誤 (參見 [`luaL_argerror`](#luaL_argerror))。
### `luaL_argerror`
[-0, +0, _v_]
```
int luaL_argerror (lua_State *L, int arg, const char *extramsg);
```
拋出一個錯誤報告調用的 C 函數的第 `arg` 個參數的問題。 它使用下列標準信息并包含了一段 `extramsg` 作為注解:
```
bad argument #_arg_ to '_funcname_' (_extramsg_)
```
這個函數永遠不會返回。
### `luaL_Buffer`
```
typedef struct luaL_Buffer luaL_Buffer;
```
_字符串緩存_ 的類型。
字符串緩存可以讓 C 代碼分段構造一個 Lua 字符串。 使用模式如下:
* 首先定義一個類型為 [`luaL_Buffer`](#luaL_Buffer) 的變量 `b`。
* 調用 `luaL_buffinit(L, &b)` 初始化它。
* 然后調用 `luaL_add*` 這組函數向其添加字符串片斷。
* 最后調用 `luaL_pushresult(&b)` 。 最后這次調用會在棧頂留下最終的字符串。
如果你預先知道結果串的長度, 你可以這樣使用緩存:
* 首先定義一個類型為 [`luaL_Buffer`](#luaL_Buffer) 的變量 `b`。
* 然后調用 `luaL_buffinitsize(L, &b, sz)` 預分配 `sz` 大小的空間。
* 接著將字符串復制入這個空間。
* 最后調用 `luaL_pushresultsize(&b, sz)`, 這里的 `sz` 指已經復制到緩存內的字符串長度。
一般的操作過程中,字符串緩存會使用不定量的棧槽。 因此,在使用緩存中,你不能假定目前棧頂在哪。 在對緩存操作的函數調用間,你都可以使用棧,只需要保證棧平衡即可; 即,在你做一次緩存操作調用時,當時的棧位置和上次調用緩存操作后的位置相同。 (對于 [`luaL_addvalue`](#luaL_addvalue) 是個唯一的例外。) 在調用完 [`luaL_pushresult`](#luaL_pushresult) 后, 棧會恢復到緩存初始化時的位置上,并在頂部壓入最終的字符串。
### `luaL_buffinit`
[-0, +0, –]
```
void luaL_buffinit (lua_State *L, luaL_Buffer *B);
```
初始化緩存 `B`。 這個函數不會分配任何空間; 緩存必須以一個變量的形式聲明 (參見 [`luaL_Buffer`](#luaL_Buffer))。
### `luaL_buffinitsize`
[-?, +?, _e_]
```
char *luaL_buffinitsize (lua_State *L, luaL_Buffer *B, size_t sz);
```
等價于調用序列 [`luaL_buffinit`](#luaL_buffinit), [`luaL_prepbuffsize`](#luaL_prepbuffsize)。
### `luaL_callmeta`
[-0, +(0|1), _e_]
```
int luaL_callmeta (lua_State *L, int obj, const char *e);
```
調用一個元方法。
如果在索引 `obj` 處的對象有元表, 且元表有域 `e` 。 這個函數會以該對象為參數調用這個域。 這種情況下,函數返回真并將調用返回值壓棧。 如果那個位置沒有元表,或沒有對應的元方法, 此函數返回假(并不會將任何東西壓棧)。
### `luaL_checkany`
[-0, +0, _v_]
```
void luaL_checkany (lua_State *L, int arg);
```
檢查函數在 `arg` 位置是否有任何類型(包括 **nil**)的參數。
### `luaL_checkinteger`
[-0, +0, _v_]
```
lua_Integer luaL_checkinteger (lua_State *L, int arg);
```
檢查函數的第 `arg` 個參數是否是一個 整數(或是可以被轉換為一個整數) 并以 [`lua_Integer`](#lua_Integer) 類型返回這個整數值。
### `luaL_checklstring`
[-0, +0, _v_]
```
const char *luaL_checklstring (lua_State *L, int arg, size_t *l);
```
檢查函數的第 `arg` 個參數是否是一個 字符串,并返回該字符串; 如果 `l` 不為 `NULL` , 將字符串的長度填入 `*l`。
這個函數使用 [`lua_tolstring`](#lua_tolstring) 來獲取結果。 所以該函數有可能引發的轉換都同樣有效。
### `luaL_checknumber`
[-0, +0, _v_]
```
lua_Number luaL_checknumber (lua_State *L, int arg);
```
檢查函數的第 `arg` 個參數是否是一個 數字,并返回這個數字。
### `luaL_checkoption`
[-0, +0, _v_]
```
int luaL_checkoption (lua_State *L,
int arg,
const char *def,
const char *const lst[]);
```
檢查函數的第 `arg` 個參數是否是一個 字符串,并在數組 `lst` (比如是零結尾的字符串數組) 中查找這個字符串。 返回匹配到的字符串在數組中的索引號。 如果參數不是字符串,或是字符串在數組中匹配不到,都將拋出錯誤。
如果 `def` 不為 `NULL`, 函數就把 `def` 當作默認值。 默認值在參數 `arg` 不存在,或該參數是 **nil** 時生效。
這個函數通常用于將字符串映射為 C 枚舉量。 (在 Lua 庫中做這個轉換可以讓其使用字符串,而不是數字來做一些選項。)
### `luaL_checkstack`
[-0, +0, _v_]
```
void luaL_checkstack (lua_State *L, int sz, const char *msg);
```
將棧空間擴展到 `top + sz` 個元素。 如果擴展不了,則拋出一個錯誤。 `msg` 是用于錯誤消息的額外文本 (`NULL` 表示不需要額外文本)。
### `luaL_checkstring`
[-0, +0, _v_]
```
const char *luaL_checkstring (lua_State *L, int arg);
```
檢查函數的第 `arg` 個參數是否是一個 字符串并返回這個字符串。
這個函數使用 [`lua_tolstring`](#lua_tolstring) 來獲取結果。 所以該函數有可能引發的轉換都同樣有效。
### `luaL_checktype`
[-0, +0, _v_]
```
void luaL_checktype (lua_State *L, int arg, int t);
```
檢查函數的第 `arg` 個參數的類型是否是 `t`。 參見 [`lua_type`](#lua_type) 查閱類型 `t` 的編碼。
### `luaL_checkudata`
[-0, +0, _v_]
```
void *luaL_checkudata (lua_State *L, int arg, const char *tname);
```
檢查函數的第 `arg` 個參數是否是一個類型為 `tname` 的用戶數據 (參見 [`luaL_newmetatable`](#luaL_newmetatable) )。 它會返回該用戶數據的地址 (參見 [`lua_touserdata`](#lua_touserdata))。
### `luaL_checkversion`
[-0, +0, –]
```
void luaL_checkversion (lua_State *L);
```
檢查調用它的內核是否是創建這個 Lua 狀態機的內核。 以及調用它的代碼是否使用了相同的 Lua 版本。 同時也檢查調用它的內核與創建該 Lua 狀態機的內核 是否使用了同一片地址空間。
### `luaL_dofile`
[-0, +?, _e_]
```
int luaL_dofile (lua_State *L, const char *filename);
```
加載并運行指定的文件。 它是用下列宏定義出來:
```
(luaL_loadfile(L, filename) || lua_pcall(L, 0, LUA_MULTRET, 0))
```
如果沒有錯誤,函數返回假; 有錯則返回真。
### `luaL_dostring`
[-0, +?, –]
```
int luaL_dostring (lua_State *L, const char *str);
```
加載并運行指定的字符串。 它是用下列宏定義出來:
```
(luaL_loadstring(L, str) || lua_pcall(L, 0, LUA_MULTRET, 0))
```
如果沒有錯誤,函數返回假; 有錯則返回真。
### `luaL_error`
[-0, +0, _v_]
```
int luaL_error (lua_State *L, const char *fmt, ...);
```
拋出一個錯誤。 錯誤消息的格式由 `fmt` 給出。 后面需提供若干參數, 這些參數遵循 [`lua_pushfstring`](#lua_pushfstring) 中的規則。 如果能獲得相關信息,它還會在消息前面加上錯誤發生時的文件名及行號。
這個函數永遠不會返回。 但是在 C 函數中通常遵循慣用法: `return luaL_error(_args_)` 。
### `luaL_execresult`
[-0, +3, _e_]
```
int luaL_execresult (lua_State *L, int stat);
```
這個函數用于生成標準庫中和進程相關函數的返回值。 (指 [`os.execute`](#pdf-os.execute) 和 [`io.close`](#pdf-io.close))。
### `luaL_fileresult`
[-0, +(1|3), _e_]
```
int luaL_fileresult (lua_State *L, int stat, const char *fname);
```
這個函數用于生成標準庫中和文件相關的函數的返回值。 (指 ([`io.open`](#pdf-io.open), [`os.rename`](#pdf-os.rename), [`file:seek`](#pdf-file:seek),等。)。
### `luaL_getmetafield`
[-0, +(0|1), _e_]
```
int luaL_getmetafield (lua_State *L, int obj, const char *e);
```
將索引 `obj` 處對象的元表中 `e` 域的值壓棧。 如果該對象沒有元表,或是該元表沒有相關域, 此函數什么也不會壓棧并返回 `LUA_TNIL`。
### `luaL_getmetatable`
[-0, +1, –]
```
int luaL_getmetatable (lua_State *L, const char *tname);
```
將注冊表中 `tname` 對應的元表 (參見 [`luaL_newmetatable`](#luaL_newmetatable))壓棧。 如果沒有 `tname` 對應的元表,則將 **nil** 壓棧并返回假。
### `luaL_getsubtable`
[-0, +1, _e_]
```
int luaL_getsubtable (lua_State *L, int idx, const char *fname);
```
確保 `t[fname]` 是一張表,并將這張表壓棧。 這里的 `t` 指索引 `idx` 處的值。 如果它原來就是一張表,返回真; 否則為它創建一張新表,返回假。
### `luaL_gsub`
[-0, +1, _e_]
```
const char *luaL_gsub (lua_State *L,
const char *s,
const char *p,
const char *r);
```
將字符串 `s` 生成一個副本, 并將其中的所有字符串 `p` 都替換為字符串 `r` 。 將結果串壓棧并返回它。
### `luaL_len`
[-0, +0, _e_]
```
lua_Integer luaL_len (lua_State *L, int index);
```
以數字形式返回給定索引處值的“長度”; 它等價于在 Lua 中調用 '`#`' 的操作 (參見 [§3.4.7](#3.4.7))。 如果操作結果不是一個整數,則拋出一個錯誤。 (這種情況只發生在觸發元方法時。)
### `luaL_loadbuffer`
[-0, +1, –]
```
int luaL_loadbuffer (lua_State *L,
const char *buff,
size_t sz,
const char *name);
```
等價于 [`luaL_loadbufferx`](#luaL_loadbufferx), 其 `mode` 參數等于 `NULL`。
### `luaL_loadbufferx`
[-0, +1, –]
```
int luaL_loadbufferx (lua_State *L,
const char *buff,
size_t sz,
const char *name,
const char *mode);
```
把一段緩存加載為一個 Lua 代碼塊。 這個函數使用 [`lua_load`](#lua_load) 來加載 `buff` 指向的長度為 `sz` 的內存區。
這個函數和 [`lua_load`](#lua_load) 返回值相同。 `name` 作為代碼塊的名字,用于調試信息和錯誤消息。 `mode` 字符串的作用同函數 [`lua_load`](#lua_load)。
### `luaL_loadfile`
[-0, +1, _e_]
```
int luaL_loadfile (lua_State *L, const char *filename);
```
等價于 [`luaL_loadfilex`](#luaL_loadfilex), 其 `mode` 參數等于 `NULL`。
### `luaL_loadfilex`
[-0, +1, _e_]
```
int luaL_loadfilex (lua_State *L, const char *filename,
const char *mode);
```
把一個文件加載為 Lua 代碼塊。 這個函數使用 [`lua_load`](#lua_load) 加載文件中的數據。 代碼塊的名字被命名為 `filename`。 如果 `filename` 為 `NULL`, 它從標準輸入加載。 如果文件的第一行以 `#` 打頭,則忽略這一行。
`mode` 字符串的作用同函數 [`lua_load`](#lua_load)。
此函數的返回值和 [`lua_load`](#lua_load) 相同, 不過它還可能產生一個叫做 `LUA_ERRFILE` 的出錯碼。這種錯誤發生于無法打開或讀入文件時,或是文件的模式錯誤。
和 [`lua_load`](#lua_load) 一樣,這個函數僅加載代碼塊不運行。
### `luaL_loadstring`
[-0, +1, –]
```
int luaL_loadstring (lua_State *L, const char *s);
```
將一個字符串加載為 Lua 代碼塊。 這個函數使用 [`lua_load`](#lua_load) 加載一個零結尾的字符串 `s`。
此函數的返回值和 [`lua_load`](#lua_load) 相同。
也和 [`lua_load`](#lua_load) 一樣,這個函數僅加載代碼塊不運行。
### `luaL_newlib`
[-0, +1, _e_]
```
void luaL_newlib (lua_State *L, const luaL_Reg l[]);
```
創建一張新的表,并把列表 `l` 中的函數注冊進去。
它是用下列宏實現的:
```
(luaL_newlibtable(L,l), luaL_setfuncs(L,l,0))
```
數組 `l` 必須是一個數組,而不能是一個指針。
### `luaL_newlibtable`
[-0, +1, _e_]
```
void luaL_newlibtable (lua_State *L, const luaL_Reg l[]);
```
創建一張新的表,并預分配足夠保存下數組 `l` 內容的空間(但不填充)。 這是給 [`luaL_setfuncs`](#luaL_setfuncs) 一起用的 (參見 [`luaL_newlib`](#luaL_newlib))。
它以宏形式實現, 數組 `l` 必須是一個數組,而不能是一個指針。
### `luaL_newmetatable`
[-0, +1, _e_]
```
int luaL_newmetatable (lua_State *L, const char *tname);
```
如果注冊表中已存在鍵 `tname`,返回 0 。 否則, 為用戶數據的元表創建一張新表。 向這張表加入 `__name = tname` 鍵值對, 并將 `[tname] = new table` 添加到注冊表中, 返回 1 。 (`__name`項可用于一些錯誤輸出函數。)
這兩種情況都會把最終的注冊表中關聯 `tname` 的值壓棧。
### `luaL_newstate`
[-0, +0, –]
```
lua_State *luaL_newstate (void);
```
創建一個新的 Lua 狀態機。 它以一個基于標準 C 的 `realloc` 函數實現的內存分配器 調用 [`lua_newstate`](#lua_newstate) 。 并把可打印一些出錯信息到標準錯誤輸出的 panic 函數(參見 [§4.6](#4.6)) 設置好,用于處理致命錯誤。
返回新的狀態機。 如果內存分配失敗,則返回 `NULL` 。
### `luaL_openlibs`
[-0, +0, _e_]
```
void luaL_openlibs (lua_State *L);
```
打開指定狀態機中的所有 Lua 標準庫。
### `luaL_optinteger`
[-0, +0, _v_]
```
lua_Integer luaL_optinteger (lua_State *L,
int arg,
lua_Integer d);
```
如果函數的第 `arg` 個參數是一個 整數(或可以轉換為一個整數), 返回該整數。 若該參數不存在或是 **nil**, 返回 `d`。 除此之外的情況,拋出錯誤。
### `luaL_optlstring`
[-0, +0, _v_]
```
const char *luaL_optlstring (lua_State *L,
int arg,
const char *d,
size_t *l);
```
如果函數的第 `arg` 個參數是一個 字符串,返回該字符串。 若該參數不存在或是 **nil**, 返回 `d`。 除此之外的情況,拋出錯誤。
若 `l` 不為 `NULL`, 將結果的長度填入 `*l` 。
### `luaL_optnumber`
[-0, +0, _v_]
```
lua_Number luaL_optnumber (lua_State *L, int arg, lua_Number d);
```
如果函數的第 `arg` 個參數是一個 數字,返回該數字。 若該參數不存在或是 **nil**, 返回 `d`。 除此之外的情況,拋出錯誤。
### `luaL_optstring`
[-0, +0, _v_]
```
const char *luaL_optstring (lua_State *L,
int arg,
const char *d);
```
如果函數的第 `arg` 個參數是一個 字符串,返回該字符串。 若該參數不存在或是 **nil**, 返回 `d`。 除此之外的情況,拋出錯誤。
### `luaL_prepbuffer`
[-?, +?, _e_]
```
char *luaL_prepbuffer (luaL_Buffer *B);
```
等價于 [`luaL_prepbuffsize`](#luaL_prepbuffsize), 其預定義大小為 `LUAL_BUFFERSIZE`。
### `luaL_prepbuffsize`
[-?, +?, _e_]
```
char *luaL_prepbuffsize (luaL_Buffer *B, size_t sz);
```
返回一段大小為 `sz` 的空間地址。 你可以將字符串復制其中以加到緩存 `B` 內 (參見 [`luaL_Buffer`](#luaL_Buffer))。 將字符串復制其中后,你必須調用 [`luaL_addsize`](#luaL_addsize) 傳入字符串的大小,才會真正把它加入緩存。
### `luaL_pushresult`
[-?, +1, _e_]
```
void luaL_pushresult (luaL_Buffer *B);
```
結束對緩存 `B` 的使用,將最終的字符串留在棧頂。
### `luaL_pushresultsize`
[-?, +1, _e_]
```
void luaL_pushresultsize (luaL_Buffer *B, size_t sz);
```
等價于 [`luaL_addsize`](#luaL_addsize),[`luaL_pushresult`](#luaL_pushresult)。
### `luaL_ref`
[-1, +0, _e_]
```
int luaL_ref (lua_State *L, int t);
```
針對棧頂的對象,創建并返回一個在索引 `t` 指向的表中的 _引用_ (最后會彈出棧頂對象)。
此引用是一個唯一的整數鍵。 只要你不向表 `t` 手工添加整數鍵, [`luaL_ref`](#luaL_ref) 可以保證它返回的鍵的唯一性。 你可以通過調用 `lua_rawgeti(L, t, r)` 來找回由 `r` 引用的對象。 函數 [`luaL_unref`](#luaL_unref) 用來釋放一個引用關聯的對象
如果棧頂的對象是 **nil**, [`luaL_ref`](#luaL_ref) 將返回常量 `LUA_REFNIL`。 常量 `LUA_NOREF` 可以保證和 [`luaL_ref`](#luaL_ref) 能返回的其它引用值不同。
### `luaL_Reg`
```
typedef struct luaL_Reg {
const char *name;
lua_CFunction func;
} luaL_Reg;
```
用于 [`luaL_setfuncs`](#luaL_setfuncs) 注冊函數的數組類型。 `name` 指函數名,`func` 是函數指針。 任何 [`luaL_Reg`](#luaL_Reg) 數組必須以一對 `name` 與 `func` 皆為 `NULL` 結束。
### `luaL_requiref`
[-0, +1, _e_]
```
void luaL_requiref (lua_State *L, const char *modname,
lua_CFunction openf, int glb);
```
如果 `modname` 不在 [`package.loaded`](#pdf-package.loaded) 中, 則調用函數 `openf` ,并傳入字符串 `modname`。 將其返回值置入 `package.loaded[modname]`。 這個行為好似該函數通過 [`require`](#pdf-require) 調用過一樣。
如果 `glb` 為真, 同時也講模塊設到全局變量 `modname` 里。
在棧上留下該模塊的副本。
### `luaL_setfuncs`
[-nup, +0, _e_]
```
void luaL_setfuncs (lua_State *L, const luaL_Reg *l, int nup);
```
把數組 `l` 中的所有函數 (參見 [`luaL_Reg`](#luaL_Reg)) 注冊到棧頂的表中(該表在可選的上值之下,見下面的解說)。
若 `nup` 不為零, 所有的函數都共享 `nup` 個上值。 這些值必須在調用之前,壓在表之上。 這些值在注冊完畢后都會從棧彈出。
### `luaL_setmetatable`
[-0, +0, –]
```
void luaL_setmetatable (lua_State *L, const char *tname);
```
將注冊表中 `tname` 關聯元表 (參見 [`luaL_newmetatable`](#luaL_newmetatable)) 設為棧頂對象的元表。
### `luaL_Stream`
```
typedef struct luaL_Stream {
FILE *f;
lua_CFunction closef;
} luaL_Stream;
```
標準輸入輸出庫中用到的標準文件句柄結構。
文件句柄實現為一個完全用戶數據, 其元表被稱為 `LUA_FILEHANDLE` (`LUA_FILEHANDLE` 是一個代表真正元表的名字的宏)。 這張元表由標準輸入輸出庫(參見 [`luaL_newmetatable`](#luaL_newmetatable))創建。
用戶數據必須以結構 `luaL_Stream` 開頭; 此結構其后可以包含任何其它數據。 `f` 域指向一個 C 數據流 (如果它為 `NULL` 表示一個沒有創建好的句柄)。 `closef` 域指向一個在關閉或回收該流時需要調用的 Lua 函數。 該函數將收到一個參數,即文件句柄。 它需要返回 **true**(操作成功)或 **nil** 加錯誤消息(出錯的時候)。 一旦 Lua 調用過這個域,該域的值就會修改為 `NULL` 以提示這個句柄已經被關閉了。
### `luaL_testudata`
[-0, +0, _e_]
```
void *luaL_testudata (lua_State *L, int arg, const char *tname);
```
此函數和 [`luaL_checkudata`](#luaL_checkudata) 類似。 但它在測試失敗時會返回 `NULL` 而不是拋出錯誤。
### `luaL_tolstring`
[-0, +1, _e_]
```
const char *luaL_tolstring (lua_State *L, int idx, size_t *len);
```
將給定索引處的 Lua 值轉換為一個相應格式的 C 字符串。 結果串不僅會壓棧,還會由函數返回。 如果 `len` 不為 `NULL` , 它還把字符串長度設到 `*len` 中。
如果該值有一個帶 `"__tostring"` 域的元表, `luaL_tolstring` 會以該值為參數去調用對應的元方法, 并將其返回值作為結果。
### `luaL_traceback`
[-0, +1, _e_]
```
void luaL_traceback (lua_State *L, lua_State *L1, const char *msg,
int level);
```
將棧 `L1` 的棧回溯信息壓棧。 如果 `msg` 不為 `NULL` ,它會附加到棧回溯信息之前。 `level` 參數指明從第幾層開始做棧回溯。
### `luaL_typename`
[-0, +0, –]
```
const char *luaL_typename (lua_State *L, int index);
```
返回給定索引處值的類型名。
### `luaL_unref`
[-0, +0, –]
```
void luaL_unref (lua_State *L, int t, int ref);
```
釋放索引 `t` 處表的 `ref` 引用對象 (參見 [`luaL_ref`](#luaL_ref) )。 此條目會從表中移除以讓其引用的對象可被垃圾收集。 而引用 `ref` 也被回收再次使用。
如果 `ref` 為 [`LUA_NOREF`](#pdf-LUA_NOREF) 或 [`LUA_REFNIL`](#pdf-LUA_REFNIL), [`luaL_unref`](#luaL_unref) 什么也不做。
### `luaL_where`
[-0, +1, _e_]
```
void luaL_where (lua_State *L, int lvl);
```
將一個用于表示 `lvl` 層棧的控制點位置的字符串壓棧。 這個字符串遵循下面的格式:
```
_chunkname_:_currentline_:
```
0 層指當前正在運行的函數, 1 層指調用正在運行函數的函數, 依次類推。
這個函數用于構建錯誤消息的前綴。