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
© Copyright 2024 ExpyDoc