標籤:style blog http color os 使用 ar strong 檔案
這篇為學習lua雜記。
一、關於lua源碼的一些檔案:
1.lua.c —— lua解譯器程式源碼。
2.lua.h —— 該標頭檔定義了Lua提供的基礎函數,包括建立Lua環境,調用Lua函數(如 lua_pcall)、讀寫Lua環境中全域變數,
以及註冊供Lua調用的新函數等。該標頭檔定義所有內容都有一個“lua_”首碼。
3.luaxlib.h —— 該標頭檔定義了Lua輔助庫提供的函數。他的所有定義都以“luaL_”為首碼(如 luaL_loadbuffer)。輔助庫是一個
使用lua.h中的API編寫出來的一個較高的抽象層。註:輔助庫沒有直接存取Lua內部,它都是官方的基礎API來完成
所有工作的。
二、關於lua的一些函數:
1.luaL_newstate() —— 建立一個新的Lua環境(或狀態)。當建立一個新的環境時,該環境為空白,新環境中沒有包含預定義的函數。
為了使Lua保持小巧,所有標準庫都被組織到了不同的包中。在lualib.h中定義了開啟這些庫的函數。
2.luaL_openlibs (lua_State *L) —— 該函數可以開啟所有的標準庫。
3.luaL_loadbuffer(L,s,sz,n) —— 編譯載入到Lua環境中的命令。如果沒有錯誤,此函數返回0,並想棧中壓入編譯後的程式塊。
4.lua_pcall(L,n,r,f) —— 通過調用此函數,將luaL_loadbuffer()壓入棧中的程式塊彈出,並在保護模式中運行它。與luaL_loadbuffer
一樣,該函數返回0表示沒有錯誤。如果發生錯誤,那麼這些函數就會向棧中壓入一條錯誤訊息。
5.lua_tostring(L,i) —— 用該函數可以擷取lua_pcall調用的函數錯誤時向棧中壓入的一條錯誤資訊。列印後,
可以用lua_pop()把它從棧中刪除。
三、關於棧的一些基礎理解:
一、關於對棧操作的一些函數:
①.壓棧操作函數
1.void lua_pushnil (lua_State *L) —— 向棧中壓入常量nil值。
2.lua_pushnumber(lua_State *L) ——向棧中壓入雙精確度浮點數。
3.lua_pushinteger(lua_State *L) —— 向棧中壓入整型數。
4.lua_pushboolean(lua_State *L) —— 向棧中壓入bool變數(C語言中用整數)。
5.lua_pushlstring(lua_State *L) —— 向棧中壓入字串(char * 及長度)。
6.lua_pushstring(lua_State *L) —— 向棧中壓入以字元零結尾的字串。
7.int lua_checkstack(lua_State *L, int sz) —— 檢查棧是否夠用。
③.查詢棧中元素
在Lua通訊中,向棧查詢元素是通過索引(index),正索引是從第一個壓入參數開始,負索引是從最後一個
壓入參數開始。
1. int lua_is*(lua_State *L, int index) —— 此類函數是查詢棧中元素是否是查詢的類型。
需要注意的是:lua_isnumber不會檢查值是否是數字類型,而是檢查值是否能轉換為數字類型,lua_isstring也具有
同樣的行為。因此,對於任何數字,lua_isstring都返回真。
2.int lua_type (lua_State *L, int idx) —— 該函數返回戰洪元素的類型。每種類型都對應一個常量,這些常量定義在標頭檔lua.h中。
注意:
該函數一般可用在一個switch語句中。另外,若要檢查一個元素是否為真正的字串或數字(無需轉換的),也可以使用換個函數。
lua_type 傳回型別常量定義
3.lua_to*系類函數用於從棧中擷取一個值,函數原型
註:當Lua調用一個C函數返回時,Lua就會清空它的棧。所以,不要在C函數之外使用在C函數內獲得的指向Lua字串的指標。
④.其他對棧操作的函數:
1.int lua_gettop (lua_State *L) —— 該函數返回棧中元素的個數,也可以說是棧頂的索引。
2.void lua_settop (lua_State *L, int idx) —— 將棧頂設定為一個指定的位置,如果之前的棧頂比新設定的更高,那麼搞出來的就被丟棄;
反之,會向棧中壓入nil來不足大小。即修改棧中元素的數量。有一個特殊的調用, lua_settop (L, 0)能清空棧。在Lua中還定義了一個
特殊的宏:#define lua_pop(L,n) lua_settop(L, -(n)-1)
3.void lua_pushvalue (lua_State *L, int idx) —— 該函數會將指定索引上的值的副本壓入棧。即,把堆棧上給定有效處索引處的元素作一
個拷貝壓棧。
4.void lua_remove (lua_State *L, int idx) —— 該函數刪除索引上的元素,並將該索引以上的元素下移以填補空缺。
5.void lua_insert (lua_State *L, int idx) —— 該函數會上移指定位置上的所有元素以開闢一個槽的空間,然後將棧頂元素移到該位置。
6.void lua_replace (lua_State *L, int idx) —— 函數會把棧頂元素移動到給定位置(並且把這個棧頂元素彈出), 不移動任何元素(因
此在那個位置處的值被覆蓋掉)。
註:
lua_settop(L,-1) 和lua_insert (L,-1)不會對棧產生影響。
lua_settop(L,-1) 為將棧頂元素設定為它當前值。
lua_insert (L,-1)為將棧頂元素移動到棧頂
希望大家多多指正,共同進步。
每天進步一點點。。。
lua--從小白開始(3)