为嵌入式Lua脚本设置“环境”

时间:2010-12-19 10:24:13

标签: c++ scripting lua

我在一个C ++应用程序中嵌入了一个Lua解释器。

我想为运行脚本设置一个'环境',以便某些变量可供所有脚本使用。

例如,我想将READ ONLY对象Foo和FooBar暴露给脚本,这样Foo和FooBar可用于所有正在运行的脚本。

有谁知道我怎么能这样做?一个片段,展示如何做到这一点非常有用。

2 个答案:

答案 0 :(得分:2)

我没有听说过Lua中的只读变量,但你可以通过函数调用使环境可用来阻止修改。

如果C ++应用程序很大,您可能希望使用工具生成可以从Lua调用的接口。我过去使用过tolua ++,运气不错:

假设demo.hpp是C ++应用程序的头文件:

#ifndef SO_DEMO_HPP
#define SO_DEMO_HPP

namespace demo
{
    class Foo
    {
        double x;

    public:
        Foo(double x) : x(x) {}
        double getX() const { return x; }
    };

    Foo* getFoo();
}

#endif

demo::getFoo()中实施demo.cpp

demo.pkg列出了应该从Lua调用的内容:

$#include "demo.hpp"

namespace demo
{
    class Foo
    {
        double getX() const;
    };

    Foo* getFoo();
}

生成包含Lua模块的demo_stub.cppdemo_stub.hpp个文件:

$ tolua++5.1 -o demo_stub.cpp -H demo_stub.hpp demo.pkg

main.cpp是一个加载demo模块的Lua解释器:

#include "demo.hpp"

extern "C" {
#include <lua.h>
#include <lualib.h>
#include <lauxlib.h>
#include <tolua++.h>
}
#include "demo_stub.hpp"

int main()
{
    lua_State *L = lua_open();

    luaL_openlibs(L);
    tolua_demo_open(L);

    if (luaL_dofile(L, NULL) != 0)
        fprintf(stderr, "%s\n", lua_tostring(L, -1));

    lua_close(L);
    return 0;
}

tolua_demo_open()函数由tolua ++生成,并在demo_stub.hpp中声明。

构建名为demo的Lua解释器:

$ g++ -I/usr/include/lua5.1 demo.cpp demo_stub.cpp main.cpp -ltolua++5.1 -llua5.1 -o demo

构建demo.lua脚本

print("Hello, world!")
print(tolua.type(demo.getFoo()))
print(demo.getFoo():getX())

并将脚本提供给解释器:

$ ./demo < demo.lua
Hello, world!
demo::Foo
42

答案 1 :(得分:0)

lua_setglobal

至于'只读',你是说Foo不会被覆盖(例如Foo = 10),或者 Foo反向是不可变的(例如{{1 }})?