2011-01-28 3 views
6

내 C++ 응용 프로그램 사용자가 작은 작업을 수행하기 위해 익명의 기능을 제공 할 수 있기를 바랍니다.루아에서 이름없는 함수를로드하려면 어떻게해야합니까?

이와 같은 작은 조각은 이상적입니다. 나는 "옳은 일"을 할 것 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_tostring에 의해 반환 된 함수를 사용하십시오. 이 청크에 매개 변수를 전달할 수도 있습니다. ... 표현식으로 액세스 할 수 있습니다. 그런 다음과 같은 매개 변수를 얻을 수 있습니다 :

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

당신은 당신을 위해 더 나은 무엇인지 결정 - 당신의 루아 함수의 라이브러리 코드베이스 내부의 "추한 코드"또는 "추한 코드를".

+0

나는 내 직감이 제안한 것처럼 해키가 아니라고 결정했다. 그리고 최종 사용자가 루아 함수를 작성하려고하기 때문에 나는 "그렇게 끔찍한"해킹이 유일한 방법이라고 생각합니다. –

+0

미칼이 맞습니다. "덩어리"는 인수를 수락 할 수 있지만 반환해야합니다. – mlepage

3

ae을보십시오. 표현식의 함수를 캐시하므로 단순히 ae_eval("a*x^2+b*x+c")이라고 말하면 한 번만 컴파일됩니다.

관련 문제