2011-01-28 15 views
6

Desidero che gli utenti della mia applicazione C++ siano in grado di fornire funzioni anonime per eseguire piccole porzioni di lavoro.Come posso caricare una funzione senza nome in Lua?

Piccoli frammenti come questo sarebbero l'ideale.

function(arg) return arg*5 end 

Ora mi piacerebbe essere in grado di scrivere qualcosa di semplice come questo per il mio codice C,

// 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); 

Tuttavia non penso lua_loadstring farà "la cosa giusta".

Sono partito con quello che mi sembra un orribile hack?

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); 

C'è una soluzione migliore?

risposta

7

Se è necessario accedere ai parametri, il modo in cui è stato scritto è corretto. lua_loadstring restituisce una funzione che rappresenta il blocco/codice che si sta compilando. Se vuoi effettivamente ottenere una funzione dal codice, devi farlo return. Faccio anche questo (in Lua) per piccoli "valutatori di espressioni", e non lo considero un "orribile hack" :)

Se hai bisogno solo di alcuni callback, senza alcun parametro, puoi scrivere direttamente il codice e utilizzare la funzione restituita da lua_tostring. Puoi anche passare i parametri a questo blocco, sarà accessibile come espressione .... Quindi è possibile ottenere i parametri come:

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

Siete voi a decidere ciò che è meglio per te - "brutto codice" all'interno della vostra base di codice libreria, o "brutto codice" nelle funzioni Lua.

+0

Ho anche deciso che non è proprio così hacky come suggerito il mio istinto. E poiché gli utenti finali scriveranno le funzioni lua, penso che il mio "non-così-orribile" hack sia l'unica strada da percorrere. –

+0

Michal ha ragione. Il "chunk" può accettare argomenti ma ha bisogno del ritorno. – mlepage

3

Dai un'occhiata al mio ae. Memorizza in cache le funzioni dalle espressioni, quindi puoi semplicemente dire ae_eval("a*x^2+b*x+c") e lo compilerà solo una volta.

Problemi correlati