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);