Lua

Programming 言語Lua の紹介
明日、さっそく仕事に役立たない
「日陰モノ勉強会シリーズ」#1
はやまかおる
@zetamatta
Programming言語Lua とは
 一般には組込み用言語として知られている
ライブラリとして、インタプリタを簡単にリンクできる。
 最新動向を取り入れながらも癖のない文法
AWK・Python・JavaScript に近いかも
クロージャとか、イタレータも使える
既にバージョン 5.1。脱皮のごとく進化する
 たいていの環境で ビルドできる
autoconf 不要。すごいねぇ。
ANSI準拠のCコンパイラなら、make ansi だけ
(そうすると、拡張ライブラリ使えんけど)
 かなり高速らしい
はかったことねーけど
す、素直な文法!?
 --階乗を計算してみる - function fact(a)
 if a > 1 then

return a*fact(a-1)
 else

return 1
 end
 end
普通のカウンタループ
 for i=1,10 do
 print( i .. "! =" .. fact(i) )
 end
fact=function(a)
;
end
というのも ok
何の変哲もない
if 文
ぱっと見、特徴が
無いのが特徴!?
⇒ 誤解・PitFall が
少ない文法
文字列連結はツードット
何でも入るテーブル(連想配列)
さりげなく local宣言
デフォルトはグローバル
 function Foo(a,b)

local result= {
テーブルに

a , -- same as "[1]=a"
無名関数をぶちこめば、

b , -- same as "[2]=b"
そのままメソッド

["a"] = a ,

b = b,

putA = function(self) print(self["a"]) end ,

putB = function(self) print(self.b) end

}
中括弧(テーブル)だけで、

return result
・配列
メソッド付きのテーブルを返 ・連想配列
 end
せば、即ちコンストラクタな
・オブジェクト
のさ(この辺流儀は様々)
 foo = Foo(100,200)
・モジュール用名前空間
 foo.putA(foo)
を全て兼ねる
 foo:putA()
コロンがメソッド
コール演算子
⇒ 文法少ない
⇒ 覚えやすい
さっそくだが、Lua の暗黒文法面
 本当に必要最小限しかない標準ライブラリ
chdir すらできない!絶望した!
だが、共有ライブラリで拡張できる(→ LuaForge)
ファイルシステム操作(lfs)、DBライブラリ(luasql)
組み込んだ本体側からもガシガシ拡張できる
 国際化対応?何それ?
漢は黙って、バイト列(→ iconv.dll )
 うっかり「:」(コロン)ではなく「.」(ドット)を使ってしまう
エラーが実行時にしか出ない
 変数はデフォルト グローバル
Perl のように use strict; が欲しかった。
でも、一応、動的回避の方法はなきにしもあらず
メタテーブル
 テーブルに対する加減乗除などの演算方法を定義
したテーブル。
 local strict={
__newindex = function(tbl,idx,val)
error(“Error!”)
_Gって、実は
end
グローバルシンボル
テーブルなのさ
}
setmetatable(_G,strict)
 「_G[idx] = val」といったことがされると、
__newindex に紐付けられた関数が
代理で呼ばれる(フックする)
Lua を組み込んでみる
(chdir 付きluaインタープリタを作ってみた)


#include <stdio.h>
#include <stdlib.h>



#include "lua.h"
#include "lualib.h"
#include "lauxlib.h"














int my_chdir(lua_State *lua)

{

const char *newdir = lua_tostring(lua,1);

if( newdir != NULL ){
引数はスタック操作
chdir( newdir );
関数で出し入れ 
return 0;

}else{
char cwd[ FILENAME_MAX ];

getcwd( cwd , sizeof(cwd) );

lua_pushstring( lua , cwd );

return 1;
}
}
# ちなみに Makefile は、こんな感じ
自前のchdir関数
testlua : testlua.c
$(CC) -o $@ $< -llua



int main(int argc, char **argv)
{
lua_State *lua;


if( argc < 2 ){
fputs("usage: testlua PROGRAMNAME.\n",stderr);
インタプリタ
return 1;
& ライブラリ
}
初期化
lua = luaL_newstate();
luaL_openlibs(lua);
lua_pushcfunction(lua , my_chdir );
lua_setglobal(lua,"chdir");
自前の
chdir関数を
luaL_dofile( lua , argv[1] );
登録
return 0;
}
ファイルを読め!
インタプリタよッ!
逆に Lua 用の DLL(so)を作る時は
 int luaopen_ライブラリ名(lua_State *lua)
{
/* ここでLua向け関数を登録 */
return 0;
}
 という初期化関数を定義しておけば、
「require “ライブラリ名” 」できるよ!
 require も関数なので、本来は「require(“ライブラリ名”)」なん
だが、「引数が文字列1個 or テーブル1個の時は丸括弧が
省略できる」。
 テーブル1個の時省略できるということは、名前付き引数によ
る関数呼び出しも出来ないことはないってことだね。
func{ param1=“hogehoge” , param2=“uhaua” }
世間に広がる Lua the world!
 mod_lua (Apache 2.4 module)
mod_perl みたいなインタプリタ常駐化ではなく…
いろんな設定を Lua で書いたりフックできるらしい
http://d.hatena.ne.jp/hiboma/20090705/1246804923
 Lua on Tyrant
KeyValue型DB「TokyoCabinet」のリモートI/F
TokyouTyrant 版 PL/SQL みたいなー
http://alpha.mixi.co.jp/blog/?p=236
 八角研究所 : Luaとなでしこのラブラブ仲良し生活
(1) - なでしこv1.522でLuaをサポート
http://www.hakkaku.net/articles/20090608-458
LUAファイル=「test001.lua」
LUAファイルを開いて、LUAする。
というソース
なのさ
まとめ:弊社で、どう使うか考えてみた!
 サーバサイド大規模開発は無理かもね
 要員調達無理すぐる
 静的チェックが弱すぎる(local問題)
 そっちは Java なり、Ruby に任せた!
 C言語ベースだから、Windows?
 static リンクして、インストールレスな 1-ファイルツールとしてばら
まくとかね(PL/SQL対抗馬「oluacle.exe」)
 「設定ファイルのふり」して組み込む
 条件が入り組むような設定だと便利
 ミドルウェアを作る人には、とてもよいツールだ
 弊社としては、ミドルウェア開発に活用するのがよいんじゃ
ねーだろうか (でも、そんなことしてたっけ?)
参考URL
 The Programming Language Lua (本家)
http://www.lua.org/
 八角研究所 : 高速スクリプト言語「Lua」を始めよう!
http://www.hakkaku.net/articles/20081023-283
 Lua 5.1 リファレンスマニュアル
http://sugarpot.sakura.ne.jp/yuno/html/lua51_manual_ja.
html
 LuaForge: Welcome
http://luaforge.net/
 404 Blog Not Found:なんてめんこい言語 - 書評 - 入門Lua
プログラミング
http://blog.livedoor.jp/dankogai/archives/51227421.html