Lua 研討會投影片

此頁面包含 1995 年 11 月在滑鐵盧大學軟體工程實驗室中所舉辦的關於 Lua 的演講投影片。當時,Lua 的最新版本為2.4,因此這些投影片已有些過時:例如,3.0 中的備用方法已由標籤方法取代,而5.0 中則由元資料表取代,此外,4.0 中的 C API 也有所變更。儘管如此,主要重點仍舊有效。

Lua,一種可擴充的延伸語言

Luiz Henrique de Figueiredo、Roberto Ierusalimschy、Waldemar Celes 著

摘要。

現今有一項重要的趨勢,就是將複雜的系統分成兩個部分:核心(以編譯語言撰寫)和組態(以直譯語言撰寫)。Lua 是一種用於組態和擴充應用程式的全新語言,Lua 結合了程序化功能與強大的資料描述功能,透過使用一種簡單但強大的資料表機制來達成。此機制實作了記錄、陣列和遞迴資料類型(指標)的概念,並加入了一些物件導向功能,例如具有動態調用的方法。Lua 提供了一種備用方法機制,讓程式設計師能夠以一些非傳統的方式擴充語言的語意。舉一個值得注意的範例,備用方法允許使用者將不同類型的繼承新增到語言中。目前,Lua 已廣泛用於生產環境中執行多項任務,包括使用者組態、一般目的資料輸入、使用者介面描述、結構化圖形元檔案儲存,以及有限元素網格的通用屬性組態。Lua 也用於多個研究專案中,例如「主動」圖形物件、分散式物件運算,以及透過用戶端程式碼透明地擴充 WWW 瀏覽器。

目錄

自訂化

組態語言

嵌入式語言

延伸語言需求

TeCGraf

TeCGraf 中延伸語言的需求

Lua 概觀

主機 x Lua 介面

資料類型和變數

關聯式陣列

關聯式陣列

反射功能

持久性

	function save(i,v)
	 local t=type(v)
	 write(i..'=')
	     if t=='nil'    then write('nil')
	 elseif t=='number' then write(v)
	 elseif t=='string' then write('"'..v..'"')
	 elseif t=='table'  then write_record(v)
	 end
	end
	
	function write_record(t)
	 local i,v=next(t,nil)
	 write('{')
	 while i do
	   save(i,v)
	   i,v=next(t,i)
	   if i then write(',') end
	 end
	 write('}')
	end
	
	writeto("state")          -- save env to file
	i,v=nextvar(nil)
	while i do
	 save(i,v) i,v=nextvar(i)
	end
	
	dofile("state")          -- restore env from file

支援物件導向程式設計

備用方法

透過備用方法進行單一繼承

	function Index(t,f)
	 if f=="parent" then
	  return oldIndex(t,f)
	 end
	 local p=t.parent
	 if type(p)=="table" then
	  return p[f]
	 else
	  return oldIndex(t,f)
	 end
	end

	oldIndex=setfallback("index", Index)

	a=Window{x=100, y=200, color="red"}
	b=Window{x=300, y=400, parent=a}

	b.color == "red"

透過備用方法進行重載

使用應用程式物件進行運算的熟悉語法
	function Overload(a,b,op)
	 local i=op.."("..a.name..","..b.name..")"
	 if T[i]==nil then
	   n=n+1 T[i]=create("t"..n)
	   write(T[i].name..'='..i.."\n")
	 end
	 return T[i]
	end
	
	function create(v)
	 local t={name=v}
	 setglobal(v,t)
	 return t
	end
	
	setfallback("arith",Overload)
	create("a") create("b") create("c")
	n=0    T={}
	
	E=(a*a+b*b)*(a*a-b*b)/(a*a+b*b+c)+(a*(b*b)*c)
	
	t1=mul(a,a)      t2=mul(b,b)      t3=add(t1,t2)
	t4=sub(t1,t2)    t5=mul(t3,t4)    t6=add(t3,c)
	t7=div(t5,t6)    t8=mul(a,t2)     t9=mul(t8,c)
	t10=add(t7,t9)
全域共用子表達式識別!

實作

與其他延伸語言的比較

與其他延伸語言的比較

結論

API

lua_Object     lua_setfallback          (char *name, lua_CFunction fallback);
void           lua_error                (char *s);
int            lua_dofile               (char *filename);
int            lua_dostring             (char *string);
int            lua_callfunction         (lua_Object function);
int            lua_call                 (char *funcname);
void           lua_beginblock           (void);
void           lua_endblock             (void);
lua_Object     lua_getparam             (int number);
#define        lua_getresult(_)         lua_getparam(_)
float          lua_getnumber            (lua_Object object);
char          *lua_getstring            (lua_Object object);
lua_CFunction  lua_getcfunction         (lua_Object object);
void          *lua_getuserdata          (lua_Object object);
void           lua_pushnil              (void);
void           lua_pushnumber           (float n);
void           lua_pushstring           (char *s);
void           lua_pushliteral          (char *s);
void           lua_pushcfunction        (lua_CFunction fn);
void           lua_pushusertag          (void *u, int tag);
void           lua_pushobject           (lua_Object object);
lua_Object     lua_getglobal            (char *name);
void           lua_storeglobal          (char *name);
void           lua_storesubscript       (void);
lua_Object     lua_getsubscript         (void);
int            lua_type                 (lua_Object object);
int            lua_lock                 (void);
lua_Object     lua_getlocked            (int ref);
void           lua_pushlocked           (int ref);
void           lua_unlock               (int ref);
lua_Object     lua_createtable          (void);