gopher-lua

23
GoOSXのアプリを 書く 2015/03/11(水) @Gonosy.go#11

Upload: takuya-ueda

Post on 14-Jul-2015

3.214 views

Category:

Technology


1 download

TRANSCRIPT

GoでOSXのアプリを書く

2015/03/11(水)@Gonosy.go#11

というのは嘘で(gopher-jsも面白いけど)

http://qiita.com/tenntenn/items/4b9587120176c2d4b454

gopher-luaを使ってみた

2015/03/11(水)@Gonosy.go#11

自己紹介

上田拓也KLab株式会社

仕事:

Luaと戦う仕事

趣味:

Go言語, JS, Luatwitter : @tenntenn

gopher-luaってなんなの?

gopher-luaとは

● 完全にGoで書かれたLuaの実装

○ 作者のブログ

○ https://github.com/yuin/gopher-lua

● GoからLuaが実行できる

● gopher-lua/ast を使うとASTも使える

● goyaccが使われてる

Luaってなんなの?

Lua

● C言語をホストとして、組み込まれる目的で使わ

れるスクリプト言語

● 動作が早い、移植しやすい

● 拡張言語として使われる

○ Redis, nginx, ....

● ゲームエンジン+Lua○ cocos2d-x, Playground, ...

私とLua

● Luaを使って開発をしている

● Luaの開発環境をもっとよりよくしたい

○ デバッガ

■ https://github.com/tenntenn/lupe

○ lint

■ https://github.com/tenntenn/lualin

gopher-luaの使い方

実行

L := lua.NewState()defer L.Close()err := L.DoString(`print("hello")`)if err != nil { panic(err)}

実行

func Double(L *lua.LState) int { lv := L.ToInt(1) L.Push(lua.LNumber(lv * 2)) return 1}

func main() { L := lua.NewState() defer L.Close() L.SetGlobal("double", L.NewFunction(Double)) }

1番目の引数をintとして受け取る

戻り値をpushする

グローバル変数にセット

AST

chunk, err := parse.Parse(f, fn)if err := nil {panic(err)}for _, s := range chunk { if fs, ok := s.(*ast.FuncDefStmt); ok { if fe, ok := fs.Name.Func.(*ast.IdentExpr); ok { fmt.Print(fe.Value) } }}

AST([]ast.Stmt)を取得

関数名を取得

関数宣言?

識別子

Go+Luaの利点

Luaを使って拡張できる

● ユーザスクリプト

○ Redisやnginxなど用途

● ゲームエンジン

○ コストの高いコアな処理はGoに任せる

○ ゲーム部分はLuaで柔軟に書く

Luaを使って設定ファイルを書く

-- config.luareturn { host = “localhost”, port = 8080,}

Luaを使って設定ファイルを書く

-- config.lualocal config = {}for i = 0, 4 do table.insert(config, { host = “localhost”, port = 8080 + i, })endreturn config

もちろんforも使える

Luaのソースファイルを解析

● ASTが取れる

● Cで書きたくない

● LuaだとLua自体に親和性があってよいが

○ コマンドラインの処理やファイルの処理が面倒

○ 正規表現?がいまいち

luaのlintを作った

lualin

● luaのlint

● 機能

○ 変数名や関数名のチェック

○ グローバル変数の有無

■ local忘れるとグローバル変数になる

○ 拡張可能なルール

実行例

今後の展望

● luaでルールを増やせるようにする

● ASTだけではできないことに対応

○ インデント

○ アンチパターンの検出

まとめ

● gopher-luaの紹介

● lualinの紹介