LINUX.ORG.RU

Библиотека для работы с lua

 .., ,


0

2

Нужен сабж. Требования:

* Обёртка над API, а не альтернативная реализация

* Мультиплатформенность (win, lin, mac)

* Наличие документации

* Скорость. Скорость критична.

Ну и, как всегда, хотелось-бы максимум возможностей при минимуме кода. Истории успеха приветствуются.

эм. а чем сама lua не устраивает? она ж как раз в качестве встраиваемого языка разрабатывается

marvin_yorke ★★★
()
Ответ на: комментарий от marvin_yorke

Во-первых, API там сишное, а во-вторых достаточно низкоуровневое. Хотелось бы чего-то объектно-ориентированного и высокоуровневого, что-бы можно было, например, выполнить функцию с аргументами и получить возвращаемую таблицу в одну строчку.

Dragon59 ★★
() автор топика
Ответ на: комментарий от Harald

нету такой

4.2 Как минимум одну нагуглил, уверен, должны быть ещё.

Dragon59 ★★
() автор топика
Ответ на: комментарий от Harald

точнее есть, мною написанная

но она сделана в рабочее время для нужд работодателя, и потому не свободное ПО :)

Harald ★★★★★
()
Ответ на: комментарий от visual

ты хоть понял что тебе надо?

Библиотеку для высокоуровневой работы с lua из плюсов, какое из этих восьми слов непонятно?

Dragon59 ★★
() автор топика
Ответ на: комментарий от visual

не давай ему ничего, пусть мучается

Нет уж спасибо, мучайся один со своими проблемами в восприятии информации.

Dragon59 ★★
() автор топика
Ответ на: комментарий от visual

да там относительно просто всё, главное помнить, что стек Lua не растёт сам автоматически до верхнего захардкоженного предела, там какую-то функцию дёргать надо, если какой-то минимум превышен

аффтаров Lua за такое расстрелять надо, они сделали кривую реализацию и не задокументировали это явно

Harald ★★★★★
()
Ответ на: комментарий от Harald

да там относительно просто всё

Ну, на словах всегда всё просто, а в итоге -2 дня времени и +1 велосипед. Если не предложат ничего лучше, использую oolua.

Dragon59 ★★
() автор топика
Последнее исправление: Dragon59 (всего исправлений: 1)
Ответ на: комментарий от Dragon59

да там не более вот этого:

#include "LuaInterpreter.h"

class LuaType
{
public:
  LuaType(LuaInterpreter *li, int index);
  LuaType(const LuaType&);
  ~LuaType();
  const char *getString(size_t *len);
  lua_Number getNumber();
  lua_Integer getLen();
  //LuaType &getTable();
  LuaType & operator[](const int index);
  LuaType & operator[](const char *key);
  LuaType & operator=(const LuaType&);
  
private:
  LuaInterpreter *luaInterpreter;
  int stackIndex;
  
};
#include "lua.hpp"
//#include "LuaType.h"
#include <map>
#include <list>

class LuaType;


class LuaInterpreter
{
  friend class LuaType;
public:
  LuaInterpreter();
  ~LuaInterpreter();
  
  void eval(const char *luaCode);
  void eval(lua_Reader reader, void *data);
  bool dofile(const char *fileName);
  
  LuaType &getGlobal(const char *name);
  void setGlobal(const char *name, const char *val);
  void setGlobal(const char *name, lua_Number val);
  
private:
  lua_State *lstate;
  std::map<int,int> stackReferences;
  std::list<LuaType*> varStorage;
  bool inDestructor;
  
  void decReference(int index);
  void delLuaVar(LuaType *v, int stackIndex);
  LuaType *addLuaVar(LuaType *v);
};

мне для своих нужд хватило

Harald ★★★★★
()

LuaJIT же

Обёртка над API, а не альтернативная реализация

В общем-то чек, произошла из оригинала базы кода, хотя я не знаю, что вы имеете в виду. Библиотека для чего, для интеграции C/Lua?

Мультиплатформенность (win, lin, mac)

Запускал даже на Андроиде.

Скорость. Скорость критична.

Просто летает

Ну и, как всегда, хотелось-бы максимум возможностей при минимуме кода.

Есть такая killer feature, после которой вы сразу захотите попробовать. Правда, по скорости она проигрывает традиционному коду, но иногда невероятно удобна.

Хотелось бы чего-то объектно-ориентированного и высокоуровневого, что-бы можно было, например, выполнить функцию с аргументами и получить возвращаемую таблицу в одну строчку.

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

elfy
()
Ответ на: комментарий от wota

теги

Ну тогда ОП совершенно не понимает, чего хочет. Как он себе представляет получение в C++ возврата от такой функции?

function foo()
	local random=math.random
	if random()>0.5 then
		return { foo=42,bar=56 }
	elseif random()>0.5 then
		return "Hello World"
	elseif random()>0.5 then
		return 1,1,2,3,5,8,11
	else
		return
	end
end
Это будет очень тяжелая и толстая обертка, потолще самой Lua в несколько раз, а весь код будут проверки и тайпкасты.

elfy
()
Ответ на: комментарий от Dragon59

По ссылке cryptic shit, хотя я с плюсами не сильно знаком, возможно там это /нормально/.

По теме: лучше не делать на сях то, что можно делать на Луа. Зачем получать таблицу и бегать по ней, если можно а) написать на Луа удобный аксессор, б) экспортировать в Луа кусочек хоста, и там все быстро сделать, используя возможности хоста из Луа, а не наоборот (все embedded языки ведь об этом, да?). System/user side при необходимости можно делить setenv'ами или _ENV в 5.2. Как уже написали, обертки для сложных случаев нетривиальны и вряд ли проще API, а в простых случаях ничем не лучше getglobal/push*/call/to*.

anonymous
()
Ответ на: комментарий от Harald

«Какую то какой то расстрелять». Мануал не читал, сразу стек засирал. Собственно проверок на дурочку в Луа нет, они вообще редко что проверяют, например попытка lua_rawgeti для не-таблицы вызовет сегфолт.

http://www.lua.org/manual/5.2/manual.html#4.1

anonymous
()

Diluculum (немного «допиленный»)

anonymous
()
#include <Diluculum/LuaState.hpp>

Diluculum::LuaState ls;
ls.doFile ("config.lua");

const std::string favColor = ls["FavoriteColor"].value().asString();
const double favPiApprox = ls["FavoritePiApproximation"].value().asNumber();

Ничего так оберточка. Правда очень близко дел с ней не имел

Еще примеры

DeKar
()
Ответ на: комментарий от anonymous

читал я мануал вдоль и поперёк

When you interact with the Lua API, you are responsible for ensuring consistency. In particular, you are responsible for controlling stack overflow. You can use the function lua_checkstack to ensure that the stack has extra slots when pushing new elements.

Whenever Lua calls C, it ensures that the stack has at least LUA_MINSTACK extra slots. LUA_MINSTACK is defined as 20, so that usually you do not have to worry about stack space unless your code has loops pushing elements onto the stack.

Это они вскользь намекают, что неплохо было бы вызывать lua_checkstack() перед пиханием чего-то в стек, но нигде явно не сказано, что lua_checkstack() выделяет память для стека, и что рост стека выше LUA_MINSTACK закончится сегфолтом.

Я при прочтении подумал так, что lua_checkstack() возвращает количество свободных слотов, оставшихся до верхнего предела LUA_MAXSTACK, который обычно где-то 100000, и который я превышать никак не собирался

Harald ★★★★★
()
Ответ на: комментарий от DeKar

Ничего так оберточка. Правда очень близко дел с ней не имел

Очень нравится API, но не нашёл сравнений скорости. Есть данные на этот счёт?

Dragon59 ★★
() автор топика
Ответ на: комментарий от Dragon59

Смотри: строка, полученная из lua_tostring, может похереться коллектором после lua_pop. Что же делать бедному врапперу? Прально, либо скопировать строку, либо засунуть ее в реестр. Поскольку время жизни возвращаемой строки в мануале не оговаривается, логично предположить первое. Много строк собираешься оттуда вынимать?

anonymous
()
Ответ на: комментарий от anonymous

Смотри: строка, полученная из lua_tostring, может похереться коллектором после lua_pop

а зачем делать pop? Пусть лежит себе в стеке

Harald ★★★★★
()
Ответ на: комментарий от Harald

До каких пор? Я вот взял .value().asString(), положил себе куда то, вышел в майнлуп, или где я там крутился. Что со строкой?

anonymous
()
Ответ на: комментарий от Harald

Ну дай бог. Доку по правьте тогда на предмет lifetime.

anonymous
()
Ответ на: комментарий от Harald

Глянул сорцы, там в .value() происходит lua_tostring с последующим lua_pop. В последний раз осмелюсь предположить, что gc отключен, потому что дальше исследовать уже не хочется. :)

Ребята, используйте нативный API.

anonymous
()
Ответ на: комментарий от Harald

Я то понял, что поделие не твое. Извиняй, если что не так сказал — критикую только код.

anonymous
()

Стукнись в жаббер. Помогу. Сейчас в разработке как раз одна либа, где в C++11 встроен lua, писал сам с нуля.

DELIRIUM ☆☆☆☆☆
()

Я так понимаю, тебе нужна не обертка API, а генератор биндингов. Так их дофига, достаточно загуглить «lua binding c++». Можно и свою прослойку написать, для узкого набора юз-кейсов может получиться легковеснее.

annulen ★★★★★
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.