рецепты lua АЛЕКСАНДР ГЛАДЫШ Спецвыпуск: Хакер, номер #064, стр. 064-042-3 print = function(...) for i = 0, arg.n -1 do __console_print(tostring(arg[i]) .. "\t") end __console_print(arg[arg.n] .. "\n") end Если нужна высокая гибкость или производительность, ты можешь написать свою функцию __console_print на C/С++, которая работает непосредственно с виртуальным стеком интерпретатора, по образцу print из базовой библиотеки функций (luaB_print() в файле lbaselib.c исходников Lua). Фактически ты только продублируешь ее исходный код, заменив в нем вызов fputs() на вызов нужной функции. Соответственно, для замены стандартного print в Lua достаточно одной строчки: print = __console_print При необходимости аналогичным образом переопределяешь и другие стандартные функции, работающие с вводом-выводом. подключение игры к движку Вместе с языком для подключения языка к твоей программе поставляется библиотека на C (Lua C API). Для взаимодействия с языком C интерпретатор Lua использует виртуальный стек. Когда из скрипта вызывается функция на C, она получает чистый экземпляр стека, который независим от стеков других функций, вызванных на данный момент, и содержит аргументы, переданные в данную функцию. Значения, возвращаемые функцией, тоже передаются через стек. Большинство функций Lua C API работают и с виртуальным стеком. Для удобства эти функции не следуют строгой стековой дисциплине, когда можно использовать только операции push и pop, но позволяют обращаться к значениям, содержащимся в стеке, по их абсолютной или относительной позиции. Подробности о работе с виртуальным стеком интерпретатора Lua расписаны в Lua Reference Manual. Чаще всего больше удобств дает работа на более высоком уровне, который предоставляют различные библиотеки-обертки. Тем не менее полезно уметь работать с интерпретатором непосредственно на уровне Lua C API, хотя бы чтобы понять, что происходит на самом деле. К тому же для некоторых специфических задач бывает просто недостаточно функциональности, предоставляемой библиотеками-обертками. Язык Lua специально создавался как язык расширения функциональности (extension programming language), поэтому достаточно легко организовать взаимодействие кода на Lua с кодом на C (и, следовательно, C++). Помимо Lua C API, существует некоторое количество оберток для этой библиотеки, призванных повысить удобство работы с Lua из C и C++. Такие обертки делятся на две основные группы: 1) генерируют прослойку межъязыкового взаимодействия автоматически на основе данных, подготовленных специальным образом; 2) служат для облегчения ручного создания такой прослойки. Несмотря на обилие оберток для подключения Lua, стоит изучить Lua C API — получишь самое полное представление о том, что происходит в программе. К тому же при всей своей мощи сам API достаточно небольшой. Необходимую информацию ищи в Lua Programming Manual и Programming With Lua. На сегодня из библиотек для обеспечения межъязыкового взаимодействия C++ с Lua наиболее развиты: ? toLua, toLua++ (www.tecgraf.puc-rio.br/~celes/tolua, www.codenix.com/~tolua); |