入門Luaプログラミング第10章 Luaのモダンな機能
連想配列――テーブルを使ったcase文やスクリプトのモジュール化、C言語で作った共有ライブラリの関数を呼ぶなど。他はスルー。
case文
Luaにはもともとcase/switch文が存在しないので、それをテーブルで作ってしまうやりかた。
> case = case or { >> a = function() >> print "function a" >> end, >> b = function() >> print "function b" >> end, >> default = function() >> print "default" >> end, >> } > code = "a" > (case[code] or case.default)() function a > code = "b" > (case[code] or case.default)() function b > code = nil > (case[code] or case.default)() default
if-elseでつなげていった場合、ifの数だけ遅くなるから場合によってはいいかも。
スクリプトのモジュール化
自作関数が増えてきたらやりたくなるのが用途ごとにスクリプトを分けること。
モジュール化したいファイルにmodule関数を使ってモジュール化する。
-- aaa.lua module("aaa", package.seeall) function bbb() print "module aaa function bbb" end ccc = "var aaa.ccc"
使う側はrequire関数で読み込む。
> require "aaa" -- スクリプトのファイル名 > aaa.bbb() -- module関数の第一引数の文字列 + メンバ関数名 module aaa function bbb > print(aaa.ccc) -- module関数の第一引数の文字列 + メンバ変数名 var aaa.ccc
簡単簡単。
C言語で作った共有ライブラリを呼ぶ
まず最初にC言語でlib.so(lib.dll)を作る。(環境は MacOS10.6.5/gcc 4.2.1/lua 5.1.4 です)
/* lib.c */ #include <lua.h> #include <lualib.h> #include <lauxlib.h> int lib_getString(lua_State* L) { lua_pushstring(L, "int lib_getString"); return 1; }
で、コンパイル。
$ gcc -I./lua-5.1.4/src -L./lua-5.1.4/src -shared -o lib.so lib.c -llua
Luaから呼ぶ。
> dll = package.loadlib("lib.so", "lib_getString") > print(dll()) "int lib_getString"
呼び出し規約とかその辺どうなってるんだろう…… C言語/gcc周りはあんまり詳しくないからなー。
とまあ、10章はこれで終わり。C言語との連携も、もう少しがんばればできそうかも。