luaでメタプログラミング(DSL)
宣言、luaは引数が文字列リテラル、テーブルリテラルだと、括弧が省略できる、ここではgenerateという関数を作っている、ようするに何かを操作する関数を作ればいい
generate "iroiro"
文脈依存、luaにはRubyやCommonLispのような、instance_evalのみたいなダイナミックスコープを扱う仕組みがない、だから文脈依存を使いたい時はオブジェクトを受けとる、もしくはテーブルを引数にしてもいい
pokemon_add (function(dep) dep.name = "pikacyu" dep.actor_type_is "enemy" dep.pokemon_type_is "denki") --もしくは pokemon_add { name = "pikacyu", actor_type = "enemy", pokemon_type_is = "denki"}
単位、ちょっと苦しいか?
mega(5) + kiro(100) + 500 >5100500
語彙、luaのmethod_missingはメタテーブルの__indexメソッドを再定義すればいい、もちろんグローバルでも有効、上のpokemon_addを定義してみる
setmetatable(_G, { __index = function(t, k) return function(...) local objname,member = string.match(objname, "^(.+)_(.+)") if(objname == "pokemon") then _G[objname][member](...) else error(...) end end}) function pokemon:new() local t = {actortype = nil, nigatetype= nil, tokuitype = nil} setmetatable(t, {}) return t end function pokemon:add (f) f(self) end --宣言に加えたい物をメソッドとして加えていく
階層データ、luaはもともとデータファイルとして開発された、テーブルにテーブルを入れ子にすればいい
感想、"function"っていちいち打つのがめんどくさい、Rubyで言うブロックが欲しいって思う
Lispだってlambdaって打つのがめんどくさいけどまだ打つのが楽w キーボードで上の段使ってない
function うつとき縦の動きがあるお、あとダイナミックスコープの必要性を知った