2011-06-22 17 views
7

me gustaría manejar el siguiente código en Lua y C:función Lua

Digamos que tengo función C llamada Foo que está obligado a Lua. Lo llamo como seguir en escritura Lua:

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

En el lado C, puedo recuperar los argumentos y puedo almacenar el número y cuerdas en mi estructura. Pero, ¿qué tipo de datos necesitaría para almacenar la función anónima? ¿Y cómo puedo llamarlo más tarde?

Respuesta

4

Puede dejar la función en algún lugar de la pila o guardarla en el registro u otra tabla con luaL_ref.

6

No se puede almacenar una función Lua como C tipo de datos, más de lo que puede almacenar una tabla Lua como un tipo de datos C.

Lo que puede hacer es usar the registry para almacenar este valor. El registro es una tabla disponible en todo el mundo para todos los usuarios de C para almacenar datos. A menudo es una buena idea elegir una sola clave para todo su código y poner una tabla en esa tecla. Esta tabla contendría los valores que desea conservar. Esto ayudará a reducir los conflictos de otros códigos C utilizando el registro.

4

Generalmente, no almacena la función en una variable C. Lo dejas en la pila y lo llamas con pcall(). Algo así como:

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 */ 
} 

He dejado de lado algunos de comprobación de errores en aras de la brevedad, pero ver Programming in Lua para un ejemplo más completo y the Lua Reference Manual para más detalles acerca de las funciones.

0

Una forma sería la de hacer el trabajo de la función anónima en el lado lua y pasar el resultado de la función de FOO(int, char*, fun_result_type fun_result)