2011-01-28 3 views
6

私のC++アプリケーションのユーザーは、小さな仕事の塊を実行するための匿名関数を提供できるようにしたいと思います。Luaで無名関数を読み込むにはどうしたらいいですか?

このような小さな断片は理想的です。私は「正しいこと」を行いますlua_loadstringと思ういけないしかし

function(arg) return arg*5 end 

は今、私は

// Push the function onto the lua stack 
lua_xxx(L, "function(arg) return arg*5 end") 
// Store it away for later 
int reg_index = luaL_ref(L, LUA_REGISTRY_INDEX); 

、私のCコードのために、このような単純なものを書くことができるようにしたいと思います。

私は恐ろしいハックのように私に気持ちが残っていますか?

void push_lua_function_from_string(lua_State * L, std::string code) 
{ 
    // Wrap our string so that we can get something useful for luaL_loadstring 
    std::string wrapped_code = "return "+code; 
    luaL_loadstring(L, wrapped_code.c_str()); 
    lua_pcall(L, 0, 1, 0); 
} 

push_lua_function_from_string(L, "function(arg) return arg*5 end"); 
int reg_index = luaL_ref(L, LUA_REGISTRY_INDEX); 

もっと良い解決法はありますか?

答えて

7

パラメータにアクセスする必要がある場合は、書いた方法が正しいです。 lua_loadstringは、コンパイルしているチャンク/コードを表す関数を返します。実際にコードから関数を取得したい場合は、returnにしなければなりません。私はこれも(「Lua」では)小さな「式評価者」のために行いますが、私はそれを「ひどいハック」とはみなしません:)

パラメータを使用せずにコールバックが必要な場合は、 lua_tostringによって返された関数を使用します。このチャンクにパラメータを渡すこともできます。...という表現でアクセスできます。そして、あなたがなどのパラメータを取得することができます。

local arg1, arg2 = ... 
-- rest of code 

あなたはあなたのために優れているかを決める - あなたのLuaの関数で、あなたのライブラリーのコードベース内の「醜いコード」、または「醜いコードを」。

+0

私はまた、私の腸が示唆しているようにそれほどハッキーではないと決めました。そして、エンドユーザはルア関数を書くつもりであるので、私は "あまりにも恐ろしい"ハックが唯一の方法だと思う。 –

+0

ミハエルはそれを正しく持っています。 "チャンク"は引数を受け入れることができますが、リターンが必要です。 – mlepage

3

私のaeを見てください。それは式から関数をキャッシュするので、単にae_eval("a*x^2+b*x+c")と言うことができ、一度コンパイルするだけです。

関連する問題