memo

2015-10-22

設定ファイルの記述言語を lua にする話

http://d.hatena.ne.jp/eel3/20150718/1437221172

というのを読んで。

python 等々の言語だとその言語自身で設定ファイルを書くというのがよく行われるけど、 そうやってしまうと別の言語からその設定を読むというのができなくなる。

複数言語から読まれることを想定するとなると、 YAML とか INI ファイルとかになるけど、 変数定義・展開くらいは欲しいなぁとか思うわけで。

で、もう S 式とかでいいんじゃないか?どの言語でも lisp interpreter の実装ありそうだし、 なんて考えたりしてたのだけど、 lua というのは確かに良いかもなぁ。

ということで、こんな設定ファイルがあるとして、

config.lua:

ADDRESS = '192.168.0.1'
PORT = PORT + 8000

python から読んでみる:

import lupa

lua = lupa.LuaRuntime()

# デフォルト設定として定義しておく
lua.globals().ADDRESS = '127.0.0.1'
lua.globals().PORT = 80

lua.execute(open('config.lua').read())

print('ADDRESS =', lua.globals().ADDRESS)
print('PORT =', lua.globals().PORT)

別の言語からもということで、 go から読んでみる:

package main

import "fmt"
import "github.com/stevedonovan/luar"

func main() {
  L := luar.Init()
  defer L.Close()

  // デフォルト設定として定義しておく
  luar.Register(L, "", luar.Map{
      "ADDRESS": "127.0.0.1",
      "PORT":    80,
  })

  if err := L.DoFile("config.lua"); err != nil {
      panic(err)
  }
  g := luar.Global(L)
  fmt.Println("ADDRESS =", g.Get("ADDRESS"))
  fmt.Println("PORT =", g.Get("PORT"))
}