LuaのGo実装GopherLuaを試してみた

はじめに

inforno :: LuaのGo言語実装を公開しましたを以前読んでましたが、試してなかったので試しました。

Lua: aboutの"What is Lua?"に

making it ideal for configuration, scripting, and rapid prototyping.

とあるようにLuaは設定ファイルとして使うことも想定されています。

ということで試してみました。

GopherLuaの利用例

hello.lua

print("hello")

a = 2
b = {
    c = 4,
    d = a + 3
}

main.go

package main

import (
    "fmt"

    "github.com/yuin/gopher-lua"
)

func main() {
    l := lua.NewState()
    defer l.Close()

    if err := l.DoFile("hello.lua"); err != nil {
        panic(err)
    }

    a := l.GetGlobal("a")
    fmt.Printf("a=%v\n", a)

    b := l.GetGlobal("b").(*lua.LTable)
    b.ForEach(func(key, value lua.LValue) {
        fmt.Printf("b.%v=%v\n", key, value)
    })
}

実行結果

$ go run main.go
hello
a=2
b.c=4
b.d=5

hello.luaに print("hello") を入れているのはLuaからの出力を試してみたかったからで、実際に設定ファイルとして使うときは変数設定だけの使い方になるでしょう。

上記では単に値を出力していますが、変数の値がプリミティブの場合は

を使えばbool, string, LNumberに変換できます。

LNumberの定義 を見ると

type LNumber float64

となっているので、Goでも数値として扱えます。

なお、Luaは5.3で数値に整数型が追加されていますが、gopher-luaはLua 5.1相当なので数値型は64bit浮動小数点数のみです。

で、table (ハッシュテーブル) 型は lua.LValue から .(*lua.Table) でTableに変換できます。

ちなみに、2.2 – Values and Type - sLua 5.1 Reference ManualにあるようにLuaのtable型は連想配列と整数インデクスでの配列を兼用したデータ型となっています。

まとめ

設定ファイルをLuaで書くようにすると、上記の hello.lua で b.da + 3 としているように変数や式が使えます。

table型があるのでネストしたデータ構造も表現できます。

ということで、Goのプログラムの設定ファイルをluaで書いてgopher-luaで解釈するというのは、かなり便利そうですね。今後活用していきたいです。yuinさん、便利なライブラリをありがとうございます!

2015-06-03 21:35 頃追記

作者の方からご指摘頂いたのですが、LValueからTableへの変換方法はREADMEのData modelに書いてありました。失礼いたしました。

またLuaを設定ファイルとして使う場合は、そのためのライブラリも書かれているので、そちらを使うほうがよいそうです。 inforno :: GopherLuaを設定ファイルで使うライブラリを書きましたをご参照ください。Goのstructの各フィールドの値をLuaのtableのデータに応じて設定してくれます。ますます便利ですね!