Вызов функции, возвращаемой lua-скриптом из C

Учитывая файл lua, например

-- foo.lua
return function (i)
  return i
end

Как я могу загрузить этот файл с помощью C API и вызвать возвращаемую функцию? Мне просто нужны вызовы функций, начинающиеся с luaL_loadfile/luaL_dostring.


person Sebastian Graf    schedule 30.08.2016    source источник


Ответы (1)


загруженный фрагмент — это обычная функция. Загрузку модуля из C можно представить так:

return (function()  -- this is the chunk compiled by load

    -- foo.lua
    return function (i)
      return i
    end

end)()  -- executed with call/pcall

Все, что вам нужно сделать, это загрузить фрагмент и вызвать его, его возвращаемое значение — ваша функция:

// load the chunk
if (luaL_loadstring(L, script)) {
    return luaL_error(L, "Error loading script: %s", lua_tostring(L, -1));
}

// call the chunk (function will be on top of the stack)
if (lua_pcall(L, 0, 1, 0)) {
    return luaL_error(L, "Error running chunk: %s", lua_tostring(L, -1));
}

// call the function
lua_pushinteger(L, 42); // function arg (i)
if (lua_pcall(L, 1, 1, 0)) {
    return luaL_error(L, "Error calling function: %s", lua_tostring(L, -1));
}
person Adam    schedule 30.08.2016
comment
Ааа, спасибо, это действительно полезная семантика слова «кусок». На самом деле, одна из версий, которые я пробовал до сих пор, была похожа, только мой первый вызов был lua_pcall(L, 0, 0), который отбрасывал результат. Это заставило меня задуматься, почему не было возвращаемого значения. - person Sebastian Graf; 31.08.2016