Настройка «среды» для встроенного скрипта Lua - PullRequest
4 голосов
/ 19 декабря 2010

Я встраиваю интерпретатор Lua в приложение C ++.

Я хочу настроить «среду» для запуска сценариев, чтобы определенные переменные были доступны для всех сценариев.

Например, я хочу, чтобы объекты REY ONLY Foo и FooBar выставлялись в сценарии, чтобы Foo и FooBar были доступны для всех запущенных сценариев.

Кто-нибудь знает, как я могу это сделать ?.Фрагмент, показывающий, как это сделать. Это будет очень полезно.

Ответы [ 2 ]

2 голосов
/ 20 декабря 2010

Я не слышал о переменных только для чтения в 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();
}

Создание файлов demo_stub.cpp и demo_stub.hpp, содержащих наш модуль Lua:

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

main.cpp - интерпретатор Lua, который загружает модуль demo:

#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.

Создайте интерпретатор Lua с именем demo:

$ 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
0 голосов
/ 20 декабря 2010

lua_setglobal.

Что касается «только для чтения», подразумеваете ли вы, что этот Foo не будет перезаписываться (например, Foo = 10) или что значение Foo reverse будет неизменным (например, Foo.x = 10)?

...