info

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 うつとき縦の動きがあるお、あとダイナミックスコープの必要性を知った