2011-06-22 19 views
7

vorrei gestire il seguente codice nel Lua e C:chiamando la funzione Lua

Diciamo che ho la funzione C denominato Foo che è destinato a Lua. Io lo chiamo come seguire nello script Lua:

Foo(15, "bar", function(z) return 2 * z + 1 end) 

Sul lato C, a recuperare gli argomenti e posso memorizzare il numero e la stringa nella mia struttura. Ma quale tipo di dati avrei bisogno per memorizzare la funzione anonima? E come posso chiamarlo dopo?

risposta

4

È possibile lasciare la funzione da qualche parte nella pila o salvarla nel Registro di sistema o in un'altra tabella con luaL_ref.

6

Non è possibile memorizzare una funzione Lua come C tipo di dati, più di quanto sia possibile memorizzare una tabella Lua come tipo di dati C.

Quello che puoi fare è usare the registry per memorizzare questo valore. Il registro è una tabella disponibile globalmente per tutti gli utenti C per l'archiviazione dei dati. Spesso è una buona idea scegliere una sola chiave per tutto il codice e mettere un tavolo in quella chiave. Questa tabella conterrà i valori che si desidera conservare. Questo aiuterà a ridurre i conflitti da altri codici C usando il registro.

4

In genere, non si memorizza la funzione in una variabile C. Lo lasci in pila e lo chiami con pcall(). Qualcosa di simile:

int l_Foo(lua_State *L) 
{ 
    lua_pop(L, 2);   /* ignore the first two args */ 
         /* (the function is now on top of the stack) */ 
    lua_pushnumber(L, 2); /* push the number to pass as z */ 
    lua_pcall(L, 1, 1, 0); /* call the function with 1 argument, expect 1 result */ 
    lua_pop(L, 1);   /* ignore the result */ 
} 

ho lasciato fuori un po 'di controllo degli errori per brevità, ma vedere Programming in Lua per un esempio più completo e the Lua Reference Manual per ulteriori dettagli sulle funzioni.

0

Un modo potrebbe essere quello di fare il lavoro di funzione anonima sul lato lua e passare il risultato della funzione di FOO(int, char*, fun_result_type fun_result)

Problemi correlati