用lua配置你的應用程序

    lua的一個重要的應用是作爲程序配置文件的語言(configuration language)。下面通過一個簡單示例來說明其應用。

從一個簡單示例開始

     假設一個c語言程序要畫一個窗口界面,窗口的長和寬可以由用戶指定。要實現這個功能還有另外更簡單的方法,例如使用環境變量或只包含(key, value)形式的普通文本文件,但是如果使用普通文本文件你還是需要對其進行解析。程序的配置文件如下(conf.lua):

--configuration file
--to define window_size
width = 200
height = 300

下面的代碼演示瞭如何用lua提供的接口來獲得這兩個全局變量的值:

#include <stdio.h>
#include <lua.h>
#include <lauxlib.h>
#include <lualib.h>
int main(int argc, const char*argv[])
{
    lua_State *l;
    l = luaL_newstate();
    luaL_openlibs(l);
    if(luaL_loadfile(l, "./conf.lua") != 0) {
        fprintf(stderr,"luaL_loadfile err: %s.\n", lua_tostring(l, -1));
        lua_close(l);
        return(-1);
    }
    if(lua_pcall(l, 0, 0, 0) != 0) {
        fprintf(stderr,"lua_pcall err: %s.\n", lua_tostring(l, -1));
        lua_close(l);
        return(-1);
    }
    lua_getglobal(l,"width");
    if(!lua_isnumber(l, -1))
        fprintf(stderr,"'width' should be a number.\n");
    else
        printf("width = %d\n", lua_tointeger(l, -1));
    lua_pop(l, 1);
    lua_getglobal(l,"height");
    if(!lua_isnumber(l, -1))
        fprintf(stderr,"'height' should be a number.\n");
    else
        printf("height = %d\n", lua_tointeger(l, -1));
    lua_pop(l, 1);
    return0;
}


程序首先通過函數luaL_newstate()創建一個lua狀態,繼而用luaL_openlibs()將函數庫添加到狀態中;然後使用函數

<span style="font-size:18px;">int luaL_loadfile(lua_State *L, const char *filename);</span>

加載並解析lua文件,完成後使用lua_pcall()執行配置文件中的語句。函數

<span style="font-size:18px;">void lua_getglobal(lua_State *L, const char *name);</span>

將lua文件中名爲name的全局變量的值放入棧中。如果變量name不存在,lua會向棧中放入一個nil值。然後使用lua_isnumber()判斷獲取的內容是否是數值,如果是的話就將其轉換成c語言對應的類型。對於lua棧,有如下的解釋:

lua 解釋器使用一個棧接口來與調用代碼通信。由c代碼將發送到lua代碼的數據push到棧上;lua 解釋器返回的響應也被push到棧上。如果傳遞給luaL_loadbuffer()的代碼有錯誤,則錯誤消息被push到棧上。棧上的項有類型和值。lua_type()函數查詢一個對象的類型;lua_to<type>()函數(例如 lua_tostring())產生被強制轉換成特定c類型的值。用lua編寫的代碼總是嚴格遵從棧模型;但是,c代碼則可以探查棧的其餘部分,甚至可以在棧中插入值。這種接口雖然簡單,但是其功能出奇強大。待執行的代碼都被同等對待;首先被 push 到棧上,然後等待lua_pcall()函數來執行它。

上面這個例子很簡單,只是用來說明lua的用法,實現這個功能可以使用其它更簡單的方法。但是使用lua作爲配置文件還有更強大的地方,例如可以使用註釋,還可以根據環境變量來作出不同的選擇,就像這樣:

--configuration file
--to define window_size
if getenv("DISPLAY") ==":0.0"then
  width =300; height =300
else
  width =200; height =200
end


 
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章