入門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言語との連携も、もう少しがんばればできそうかも。