Lua セミナー資料

このページには、1995年11月にウォータールー大学ソフトウェア工学研究所で行われたLuaに関する講演のスライドが含まれています。当時、Luaの最新バージョンは2.4だったため、これらのスライドはやや時代遅れです。例えば、フォールバックは3.0でタグメソッドに、5.0でメタテーブルに置き換えられ、C APIは4.0で変更されました。それでも、主要な点は依然として有効です。

Lua、拡張可能な拡張言語

Luiz Henrique de Figueiredo、Roberto Ierusalimschy、Waldemar Celes 著

概要

今日では、複雑なシステムを2つの部分に分割するという重要な傾向があります。カーネル(コンパイル言語で記述)と設定(インタプリタ言語で記述)です。Luaは、アプリケーションを設定および拡張するための新しい言語です。Luaは、シンプルでありながら強力なテーブルのメカニズムを使用して、手続き型機能と強力なデータ記述機能を組み合わせます。このメカニズムは、レコード、配列、および再帰データ型(ポインタ)の概念を実装し、動的ディスパッチを備えたメソッドなどのオブジェクト指向機能を追加します。Luaは、プログラマーが従来とは異なる方法で言語のセマンティクスを拡張することを可能にするフォールバックのメカニズムを提供します。注目すべき例として、フォールバックにより、ユーザーは言語にさまざまな種類の継承を追加できます。現在、Luaは、ユーザー設定、汎用データ入力、ユーザーインターフェースの記述、構造化グラフィックメタファイルの保存、有限要素メッシュの汎用属性設定など、いくつかのタスクの produção で広く使用されています。「アクティブな」グラフィックオブジェクト、分散オブジェクトを使用したコンピューティング、クライアントサイドコードによるWWWブラウザの透過的な拡張など、いくつかの研究プロジェクトでもLuaが使用されています。

目次

カスタマイズ

設定言語

埋め込み言語

拡張言語の要件

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