<?xml version="1.0" encoding="UTF-8" ?>
<?xml-stylesheet type="text/xsl" href="http://www.itkazan.com/utility/FeedStylesheets/rss.xsl" media="screen"?><rss version="2.0" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:slash="http://purl.org/rss/1.0/modules/slash/" xmlns:wfw="http://wellformedweb.org/CommentAPI/"><channel><title>Персональный блог Дмитрия Шмыкова</title><link>http://www.itkazan.com/blogs/dmitryshm/default.aspx</link><description>Блог предназначен для чтения программистами, которые пишут на С++. Публикуются способы использования библиотек С++, решения возникающих по ходу их использования проблем, ответы на часто задаваемые вопросы. Идейной составляющей материалов хочется видеть попытку представить &amp;quot;сложный&amp;quot; на первый взгляд язык С++, как простой язык на каждый день для написания качественного кода.</description><dc:language /><generator>CommunityServer 2007 SP2 (Build: 20611.960)</generator><item><title>полезная книжка по информатике для начинающих</title><link>http://www.itkazan.com/blogs/dmitryshm/archive/2007/12/28/1681.aspx</link><pubDate>Fri, 28 Dec 2007 11:28:00 GMT</pubDate><guid isPermaLink="false">a0bcd6ff-3bec-41dc-9fcd-885f6beec21b:1681</guid><dc:creator>dmitryshm</dc:creator><slash:comments>0</slash:comments><wfw:commentRss xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://www.itkazan.com/blogs/dmitryshm/rsscomments.aspx?PostID=1681</wfw:commentRss><comments>http://www.itkazan.com/blogs/dmitryshm/archive/2007/12/28/1681.aspx#comments</comments><description>&lt;p&gt;Известная книжка Окулова по информатике прекрасно подойдет тем, кто начинает изучать программирование.&lt;a href="http://itkazan.com/blogs/dmitryshm/okulov.zip"&gt;okulov.zip&lt;/a&gt;&lt;/p&gt;&lt;img src="http://www.itkazan.com/aggbug.aspx?PostID=1681" width="1" height="1"&gt;</description><category domain="http://www.itkazan.com/blogs/dmitryshm/archive/tags/_3F0440043E043304400430043C043C04380440043E04320430043D0438043504_/default.aspx">программирование</category></item><item><title>Бесплатные семинары от SoftLine</title><link>http://www.itkazan.com/blogs/dmitryshm/archive/2007/12/14/softline.aspx</link><pubDate>Thu, 13 Dec 2007 22:13:00 GMT</pubDate><guid isPermaLink="false">a0bcd6ff-3bec-41dc-9fcd-885f6beec21b:1667</guid><dc:creator>dmitryshm</dc:creator><slash:comments>0</slash:comments><wfw:commentRss xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://www.itkazan.com/blogs/dmitryshm/rsscomments.aspx?PostID=1667</wfw:commentRss><comments>http://www.itkazan.com/blogs/dmitryshm/archive/2007/12/14/softline.aspx#comments</comments><description>&lt;p&gt;Уважаемые господа!&lt;/p&gt;
&lt;p&gt;Компания Softline и корпорация Microsoft приглашают Вас 25 декабря 2007 г., принять участие в БЕСПЛАТНОМ семинаре на тему : &lt;b&gt;&amp;quot;&lt;/b&gt;&lt;b&gt;Защищенная ИТ-инфраструктура - фундамент успешного бизнеса&lt;/b&gt;&lt;b&gt;!&amp;quot;&lt;/b&gt;&lt;/p&gt;
&lt;p&gt;&lt;b&gt;Мероприятие будет проходить по адресу: г. Казань, ул. Достоевского, &amp;nbsp;д. 18/75, офисный центр «Сувар-Казань», конференц-зал&lt;/b&gt;&lt;/p&gt;
&lt;p&gt;Под эффективно работающей ИТ - инфраструктурой мы понимаем систему, которая помогает усовершенствовать текущие бизнес-процессы, повысить общекорпоративную отдачу и уменьшить сроки выполнения работ. Для того, чтобы достичь поставленной цели, ИТ - инфраструктура должна быть динамичной, эффективной, надежной и безопасной, она должна быть защищена от внешних воздействий и при этом без промедлений и простоев обслуживать любые хозяйственные операции.&lt;/p&gt;
&lt;p&gt;На семинаре участники будут ознакомлены с продуктовыми линейками Microsoft по защите информационных систем, такими как ISA Server 2006, ForeFront, особое внимание будет уделено новому продукту - Forefront Client Security. Вы сможете увидеть демонстрацию этого продукта, узнать о новых возможностях и задать интересующие вопросы представителям компаний Softline и Microsoft.&lt;/p&gt;
&lt;p&gt;На семинар приглашаются технические директора и руководители IT-департаментов, инженеры, заинтересованные в стабильности работы IT-инфраструктуры компании.&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&amp;nbsp;ПРОГРАММА СЕМИНАРА:&lt;/p&gt;
&lt;table class="" cellspacing="0" cellpadding="0"&gt;

&lt;tr&gt;
&lt;td class=""&gt;
&lt;p&gt;09.30 - 10.00&lt;/p&gt;&lt;/td&gt;
&lt;td class=""&gt;
&lt;p&gt;Регистрация участников, кофе&lt;/p&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;
&lt;td class=""&gt;
&lt;p&gt;10.00 - 10.15&lt;/p&gt;&lt;/td&gt;
&lt;td class=""&gt;
&lt;p&gt;Вступительное слово&lt;/p&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;
&lt;td class=""&gt;
&lt;p&gt;10.15 - 10.30&lt;/p&gt;&lt;/td&gt;
&lt;td class=""&gt;
&lt;p&gt;Стратегия Microsoft в области информационной безопасности. Обзор семейства продуктов Forefront&lt;/p&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;
&lt;td class=""&gt;
&lt;p&gt;10.30 - 11.30&lt;/p&gt;&lt;/td&gt;
&lt;td class=""&gt;
&lt;p&gt;Защита периметра сети с помощью ISA Server 2006&lt;/p&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;
&lt;td class=""&gt;
&lt;p&gt;11.30 - 11.50&lt;/p&gt;&lt;/td&gt;
&lt;td class=""&gt;
&lt;p&gt;Перерыв, кофе&lt;/p&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;
&lt;td class=""&gt;
&lt;p&gt;11.50 - 12.30&lt;/p&gt;&lt;/td&gt;
&lt;td class=""&gt;
&lt;p&gt;Защита рабочих станций и файловых серверов посредством Forefront Client Security&lt;/p&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;
&lt;td class=""&gt;
&lt;p&gt;12.30 - 13.20&lt;/p&gt;&lt;/td&gt;
&lt;td class=""&gt;
&lt;p&gt;Решение Forefront Server Security для защиты электронной почты и серверов совместной работы&lt;/p&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;
&lt;td class=""&gt;
&lt;p&gt;13.20 - 14.00&lt;/p&gt;&lt;/td&gt;
&lt;td class=""&gt;
&lt;p&gt;Сессия вопросов и ответов.&lt;/p&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;p&gt;С докладами выступят Алексей Галков, компания Microsoft и Максим Косинов, специалист компании Softline&lt;/p&gt;
&lt;p&gt;Зарегистрироваться можно:&lt;/p&gt;
&lt;p&gt;&lt;a href="http://softline/"&gt;http://softline/&lt;/a&gt;&amp;nbsp; &lt;/p&gt;
&lt;p&gt;e-mail: &lt;a href="mailto:info.kzn@softline.ru"&gt;mailto:info.kzn@softline.ru&lt;/a&gt; &lt;/p&gt;
&lt;p&gt;tel.: +7 (843) 527-98-50&lt;/p&gt;
&lt;p&gt;ПРЕДВАРИТЕЛЬНАЯ РЕГИСТРАЦИЯ&amp;nbsp; ЯВЛЯЕТСЯ ОБЯЗАТЕЛЬНОЙ!&lt;/p&gt;
&lt;p&gt;======================================================&lt;/p&gt;
&lt;p&gt;Контактное лицо: Ольга Миняйло, менеджер по маркетингу &lt;/p&gt;
&lt;p&gt;tel.: +7 (843) 527-98-50&lt;/p&gt;
&lt;p&gt;А вот еще одно приглашение...&lt;/p&gt;
&lt;p&gt;Приглашаем Вас &lt;b&gt;21.12.2007&lt;/b&gt; принять участие в&lt;b&gt; БЕСПЛАТНОМ «Тест-драйве &lt;/b&gt;&lt;b&gt;Windows server&lt;/b&gt;&lt;b&gt; 2008».&lt;/b&gt;&lt;/p&gt;
&lt;p&gt;Тест-драйв представляет собой мастер-класс, где каждый посетитель будет обеспечен отдельным рабочим местом и материалами, необходимыми для эффективного изучения. &lt;/p&gt;
&lt;p&gt;Тест-драйв это отличный шанс, за короткое время, освоить навыки работы с новым продуктом. Тест-драйв будет проходить в Технопарке «Идея», ул. Петербургская, д.50 с 9.30 до-12.30 и с 13.30-16.30&lt;/p&gt;
&lt;p&gt;Предварительная регистрация на мероприятие является обязательной. Дополнительные вопросы и регистрация у менеджера по маркетингу Softline в Казани Ольги Миняйло &lt;b&gt;&lt;a title="mailto:olgami@softline.ru" href="mailto:olgami@softline.ru"&gt;olgami@softline.ru&lt;/a&gt; &lt;/b&gt;, &lt;b&gt;тел.: (843) 527-98-50&lt;/b&gt;&lt;/p&gt;&lt;img src="http://www.itkazan.com/aggbug.aspx?PostID=1667" width="1" height="1"&gt;</description><category domain="http://www.itkazan.com/blogs/dmitryshm/archive/tags/_410435043C0438043D0430044004_/default.aspx">семинар</category></item><item><title>Правила работы над проектами Visual C++</title><link>http://www.itkazan.com/blogs/dmitryshm/archive/2007/11/17/visual-c.aspx</link><pubDate>Sat, 17 Nov 2007 16:45:00 GMT</pubDate><guid isPermaLink="false">a0bcd6ff-3bec-41dc-9fcd-885f6beec21b:1609</guid><dc:creator>dmitryshm</dc:creator><slash:comments>2</slash:comments><wfw:commentRss xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://www.itkazan.com/blogs/dmitryshm/rsscomments.aspx?PostID=1609</wfw:commentRss><comments>http://www.itkazan.com/blogs/dmitryshm/archive/2007/11/17/visual-c.aspx#comments</comments><description>&lt;p&gt;&lt;em&gt;&lt;a href="http://itkazan.com/blogs/dmitryshm/работа%20над%20проектами%20в%20FunZai.pdf"&gt;работа над проектами в FunZai.pdf&lt;/a&gt;&lt;/em&gt;&lt;em&gt;&lt;/em&gt;&lt;/p&gt;
&lt;div&gt;Захотел опубликовать некое подобие стандарта для работы отдела, практикующего написание кода и ведение проектов Visual C++. Эта статья основана на замечательной книге &amp;quot;С++ Coding Standards: 101 Rules, Guidelines and Best Practices&amp;quot; by Herb Sutter, Andrei Alecsandrescu. Кое что добавил я &amp;quot;от себя&amp;quot;. В кавычках, т.к. эти мысли все равно не могу себе присвоить. Где-то я все-таки это вычитал, как и многие из нас,&amp;nbsp;публикуя что-то более-менее стоящее.&lt;/div&gt;
&lt;div&gt;&amp;nbsp;&lt;/div&gt;
&lt;div&gt;Приследую две цели. Самое главное --- замечания и предложения, ведь редко кто публикует нечто подобное. Следующая цель --- помочь программистам в их деле, особенно ведущим программистам и менеждерам проектов в тяжком труде. Эта дока поможет создать в команде рабочую обстановку и может избавить от детских вопросов и ошибок.&lt;/div&gt;&lt;img src="http://www.itkazan.com/aggbug.aspx?PostID=1609" width="1" height="1"&gt;</description><category domain="http://www.itkazan.com/blogs/dmitryshm/archive/tags/C_2B002B00_/default.aspx">C++</category><category domain="http://www.itkazan.com/blogs/dmitryshm/archive/tags/_4104420430043D043404300440044204_/default.aspx">стандарт</category><category domain="http://www.itkazan.com/blogs/dmitryshm/archive/tags/_3F0440043004320438043B043004_/default.aspx">правила</category></item><item><title>Библиотека Diluculum для работы со скриптовым языком Lua из С++</title><link>http://www.itkazan.com/blogs/dmitryshm/archive/2007/11/16/diluculum-lua.aspx</link><pubDate>Fri, 16 Nov 2007 21:06:00 GMT</pubDate><guid isPermaLink="false">a0bcd6ff-3bec-41dc-9fcd-885f6beec21b:1603</guid><dc:creator>dmitryshm</dc:creator><slash:comments>5</slash:comments><wfw:commentRss xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://www.itkazan.com/blogs/dmitryshm/rsscomments.aspx?PostID=1603</wfw:commentRss><comments>http://www.itkazan.com/blogs/dmitryshm/archive/2007/11/16/diluculum-lua.aspx#comments</comments><description>&lt;p&gt;&lt;strong&gt;Коротко о Lua&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;Lua&amp;nbsp;— это скриптовый язык. Он используется, в основном, в игровой индустрии. Это связано с тем, что большинство игр написано на С++, а Lua часто используется вместе с С++. Для получения информации по Lua достаточно в Вашей любимой поисковой системе набрать &amp;quot;скриптовый язык Lua&amp;quot;. Скорее всего будет найдена &lt;a href="http://ru.wikipedia.org/wiki/Lua" target="_blank"&gt;&lt;font color="#000080"&gt;статья в википедии&lt;/font&gt;&lt;/a&gt;. Полезная статья. С нее Вы сможете зайти на несколько полезных сайтов, посвященных Lua и всевозможным утилитам и библиотекам, прочему Lua-инструментарию. Русский перевод официальной доки можно найти &lt;a href="http://www.botik.ru/~rldp/mysql/mysqldev/glava04.htm" target="_blank"&gt;&lt;font color="#000080"&gt;здесь&lt;/font&gt;&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Коротко о Diluculum&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;Несмотря на то, что сам по себе Lua хорош, его надо уметь использовать из С++. Чтобы это можно было делать, в Lua были встроены механизмы, основанные на работе со стеком и прочими вещами, которые, вообще говоря, неудобны в использовании. Написано несколько библиотек для удобной работы с Lua. Здесь речь будет идти о библиотеке Diluculum. Мне она понравилась больше всех остальных. На данный момент она используется весьма редко, т.к. работает с Lua 5.1, что интерфейсно не совместимо с Lua 5.0 (там были переделаны некоторые заголовочные файлы). Для достижения совместимости с Lua 5.0 можно воспользоваться советами пользователей Lua из многочисленных форумов. В любом случае, если Вы пишете новую программу, Lua версий ниже 5.1 для Вас уже не существует. Из-за того, что Diluculum является сравнительно новой библиотекой, она оказалась весьма продуманной с точки зрения удобств использования.&lt;/p&gt;
&lt;p&gt;Приведу перевод &lt;a href="http://www.stackedboxes.org/Projects/Diluculum/Documentation/Doxygen/pag-UsersGuide.html" target="_blank"&gt;&lt;font color="#000080"&gt;Diluculum Quick User&amp;#39;s Guide&lt;/font&gt;&lt;/a&gt; на русский язык. Постараюсь лично от себя ничего не добавлять, т.к. автор и так хорошо изложил идеи. Надеюсь, что благодаря этой статье богатство Lua станет доступно более широкому кругу пользователей C++. Стоит добавить, что подобные библиотеки для работы с Lua есть и для C#, и для Java.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Diluculum Quick User&amp;#39;s Guide&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;&lt;em&gt;&lt;strong&gt;Введение&lt;/strong&gt;&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;Diluculum — это библиотека, предназначенная для гармоничного сосуществования кода на С++ и кода на Lua. В этом смысле библиотека может предложить следующее:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p style="MARGIN-BOTTOM:0cm;"&gt;Удобный доступ к Lua-данным. Это достигается через использование объектов класса &lt;a href="http://www.stackedboxes.org/Projects/Diluculum/Documentation/Doxygen/classDiluculum_1_1LuaState" target="_blank"&gt;&lt;font color="#000080"&gt;Diluculum::LuaState&lt;/font&gt;&lt;/a&gt;, который инкапсулирует lua_State* (информация по lua_State находится в документации по Lua).&lt;/p&gt;
&lt;li&gt;
&lt;p style="MARGIN-BOTTOM:0cm;"&gt;Неплохой способ делать доступными функции С++ из Lua через использование макроса &lt;a href="http://www.stackedboxes.org/Projects/Diluculum/Documentation/Doxygen/LuaWrappers_8hpp.html#3daed6c71e578b4624baffe58e0eb125" target="_blank"&gt;&lt;font color="#000080"&gt;DILUCULUM_WRAP_FUNCTION()&lt;/font&gt;&lt;/a&gt;.&lt;/p&gt;
&lt;li&gt;
&lt;p&gt;Ограниченный, однако весьма удобный, способ регистрировать классы на С++ в Lua (чтобы можно было создавать объекты этих классов из Lua [так называемые Lua-managed объекты]). Это можно сделать&amp;nbsp;посредством использования макросов &lt;a href="http://www.stackedboxes.org/Projects/Diluculum/Documentation/Doxygen/LuaWrappers_8hpp.html#abc543a317b1623f2079f75155eb3a21" target="_blank"&gt;&lt;font color="#000080"&gt;DILUCULUM_BEGIN_CLASS()&lt;/font&gt;&lt;/a&gt;, DILUCULUM_END_CLASS() и &lt;a href="http://www.stackedboxes.org/Projects/Diluculum/Documentation/Doxygen/LuaWrappers_8hpp.html#917538e1624f2dd2fa8c3d9a8e1a2fc8" target="_blank"&gt;&lt;font color="#000080"&gt;DILUCULUM_REGISTER_OBJECT()&lt;/font&gt;&lt;/a&gt;.&lt;/p&gt;&lt;/li&gt;&lt;/ul&gt;
&lt;p style="MARGIN-BOTTOM:0cm;"&gt;В следующих параграфах описывается каждый из этих трех пунктов более детально. Замечание: Diluculum включает юнит-тесты для каждой его особенности в папке Tests дистрибутива с исходниками. Они могут использоваться как хорошие примеры использования библиотеки.&lt;/p&gt;
&lt;p style="MARGIN-BOTTOM:0cm;"&gt;&lt;strong&gt;&lt;i&gt;Получение доступа к данным Lua State из C++&lt;/i&gt;&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;Класс &lt;a href="http://www.stackedboxes.org/Projects/Diluculum/Documentation/Doxygen/classDiluculum_1_1LuaState.html" target="_blank"&gt;&lt;font color="#000080"&gt;Diluculum::LuaState&lt;/font&gt;&lt;/a&gt; инкапсулирует lua_State*, хендл, через который идет работа с Lua-интерпретатором. Lua часто используется, как конфигурационный язык. Для этой цели очень хорошо использовать объекты класса &lt;a href="http://www.stackedboxes.org/Projects/Diluculum/Documentation/Doxygen/classDiluculum_1_1LuaState.html" target="_blank"&gt;&lt;font color="#000080"&gt;Diluculum::LuaState&lt;/font&gt;&lt;/a&gt;. Пусть у нас имеется конфигурационный файл config.lua какого-нибудь приложения.&lt;/p&gt;
&lt;blockquote style="MARGIN-BOTTOM:0cm;"&gt;-- A configuration file&lt;/blockquote&gt;
&lt;blockquote style="MARGIN-BOTTOM:0cm;"&gt;FavoriveColor = &amp;quot;blue&amp;quot;&lt;/blockquote&gt;
&lt;blockquote style="MARGIN-BOTTOM:0cm;"&gt;FavoritePiApproximation = 22 / 7&lt;/blockquote&gt;
&lt;blockquote style="MARGIN-BOTTOM:0cm;"&gt;UserInfo = {&lt;/blockquote&gt;
&lt;blockquote style="MARGIN-BOTTOM:0cm;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; Name = &amp;quot;Fulano de Tal&amp;quot;,&lt;/blockquote&gt;
&lt;blockquote style="MARGIN-BOTTOM:0cm;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; Age = 33,&lt;/blockquote&gt;
&lt;blockquote style="MARGIN-BOTTOM:0cm;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; LikeLargeIcons = true&lt;/blockquote&gt;
&lt;blockquote style="MARGIN-BOTTOM:0cm;"&gt;}&lt;/blockquote&gt;
&lt;blockquote style="MARGIN-BOTTOM:0cm;"&gt;WindowSize = { 456, 234 };&lt;/blockquote&gt;
&lt;blockquote style="MARGIN-BOTTOM:0cm;"&gt;function EmphasizeFunc(s)&lt;/blockquote&gt;
&lt;blockquote style="MARGIN-BOTTOM:0cm;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; return &amp;quot;&amp;lt;EMPH&amp;gt;&amp;quot;..s..&amp;quot;&amp;lt;/EMPH&amp;gt;&amp;quot;&amp;nbsp;&lt;/blockquote&gt;
&lt;blockquote&gt;end&lt;/blockquote&gt;
&lt;p&gt;Для того, чтобы получить информацию из этого файла и использовать ее из С++, первым делом создадим объект класса Diluculum::LuaState, как показано в следующем листинге.&lt;/p&gt;
&lt;blockquote style="MARGIN-BOTTOM:0cm;"&gt;#include &amp;lt;&lt;a href="http://www.stackedboxes.org/Projects/Diluculum/Documentation/Doxygen/LuaState_8hpp.html" target="_blank"&gt;&lt;font color="#000080"&gt;Diluculum/LuaState.hpp&lt;/font&gt;&lt;/a&gt;&amp;gt;&lt;/blockquote&gt;
&lt;blockquote style="MARGIN-BOTTOM:0cm;"&gt;//..&lt;/blockquote&gt;
&lt;blockquote style="MARGIN-BOTTOM:0cm;"&gt;Diluculum::LuaState ls;&lt;/blockquote&gt;
&lt;blockquote&gt;ls.&lt;a href="http://www.stackedboxes.org/Projects/Diluculum/Documentation/Doxygen/classDiluculum_1_1LuaState.html#698225e4ad32ebe8724026961b7654e1" target="_blank"&gt;&lt;font color="#000080"&gt;doFile&lt;/font&gt;&lt;/a&gt;(&amp;quot;config.lua&amp;quot;);&lt;/blockquote&gt;
&lt;p&gt;Теперь мы можем использовать operator[] для получения переменных, а затем и их значений.&lt;/p&gt;
&lt;blockquote style="MARGIN-BOTTOM:0cm;"&gt;const std::string favColor = ls[&amp;quot;FavoriteColor&amp;quot;].value().asString();&lt;/blockquote&gt;
&lt;blockquote style="MARGIN-BOTTOM:0cm;"&gt;const double favApprox = ls[&amp;quot;FavoritePiApproximation&amp;quot;].value().asNumber();&lt;/blockquote&gt;
&lt;blockquote style="MARGIN-BOTTOM:0cm;"&gt;const std::string userName = ls[&amp;quot;UserInfo&amp;quot;][&amp;quot;Name&amp;quot;].value().asString();&lt;/blockquote&gt;
&lt;blockquote style="MARGIN-BOTTOM:0cm;"&gt;const int userAge = static_cast&amp;lt;int&amp;gt;(ls[&amp;quot;UserInfo&amp;quot;][&amp;quot;Age&amp;quot;].value().asNumber());&lt;/blockquote&gt;
&lt;blockquote style="MARGIN-BOTTOM:0cm;"&gt;const bool userLikesLargeIcons = ls[&amp;quot;UserInfo&amp;quot;][&amp;quot;LikesLargeIcons&amp;quot;].asBoolean();&lt;/blockquote&gt;
&lt;blockquote style="MARGIN-BOTTOM:0cm;"&gt;const int winWidth = static_cast&amp;lt;int&amp;gt;(ls[&amp;quot;WindowSize&amp;quot;][1].value().asNumber());&lt;/blockquote&gt;
&lt;blockquote&gt;const int winHeight = static_cast&amp;lt;int&amp;gt;(ls[&amp;quot;WindowSize&amp;quot;][2].value().asNumber());&lt;/blockquote&gt;
&lt;p&gt;Вызовы функций value(), asNumber() и asString() выглядят немного громоздко, но это совсем не является недостатком (не забудем, что переменные в Lua не являются типизированными, так что из одной и той же переменной можно получить как, скажем, строку, так и число, если &lt;em&gt;преобразование &lt;/em&gt;позволяет {на самом деле типы есть, просто они спрятаны от пользователя [вспоминаем VARIANT]}). Перегружены все операторы для основных типов С++, поддерживаемых Lua, чтобы пользователи библиотеки могли писать нечто подобное.&lt;/p&gt;
&lt;blockquote style="MARGIN-BOTTOM:0cm;"&gt;if (ls[&amp;quot;UserInfo&amp;quot;][&amp;quot;LikesLargeIcons&amp;quot;])&lt;/blockquote&gt;
&lt;blockquote style="MARGIN-BOTTOM:0cm;"&gt;{&lt;/blockquote&gt;
&lt;blockquote style="MARGIN-BOTTOM:0cm;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; //...&lt;br /&gt;}&lt;/blockquote&gt;
&lt;blockquote style="MARGIN-BOTTOM:0cm;"&gt;if (ls[&amp;quot;FavoriteColor&amp;quot;] != &amp;quot;blue&amp;quot;)&lt;/blockquote&gt;
&lt;blockquote style="MARGIN-BOTTOM:0cm;"&gt;
&lt;p&gt;{&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&amp;nbsp; cout &amp;lt;&amp;lt; &amp;quot;You have bad taste for colors&amp;quot; &amp;lt;&amp;lt; endl;&lt;br /&gt;}&lt;/p&gt;&lt;/blockquote&gt;
&lt;p&gt;Вы могли заметить, чтов файле config.lua была определена функция. Она может быть вызвана из С++ без особых затруднений. Однако есть один важный момент. Функции в Lua могут возвращать произвольное количество значений. Поэтому возвращаемым значением будет объект класса &lt;a href="http://www.stackedboxes.org/Projects/Diluculum/Documentation/Doxygen/namespaceDiluculum.html#42c98ce88a934306768ba5b0ab3e0bf0" target="_blank"&gt;&lt;font color="#000080"&gt;Diluculum::LuaValueList&lt;/font&gt;&lt;/a&gt;. Код, приведенный ниже, показывает как вызывается Lua-функция из С++.&lt;/p&gt;
&lt;blockquote style="MARGIN-BOTTOM:0cm;"&gt;Diluculum::LuaValueList ret = ls[&amp;quot;EmphasizeFunc&amp;quot;](&amp;quot;String to be emphasized&amp;quot;);&lt;/blockquote&gt;
&lt;blockquote&gt;cout &amp;lt;&amp;lt; ret[0].asString() &amp;lt;&amp;lt; endl;&lt;/blockquote&gt;
&lt;p style="MARGIN-BOTTOM:0cm;"&gt;Заметьте, что никакого вызова функции value() здесь не требуется. Вызовы Lua-функции из С++ уже возвращают значения (список объектов класса Diluculum::LuaValue), а не переменные (Diluculum::LuaVariable), из которых еще нужно получать значения (как следствие, нетипизированное использование значений в этом случае повлечет LuaException).&lt;/p&gt;
&lt;p&gt;Перегрузки оператора operator[], которые определены и используются в библиотеке, позволяют записывать значения в Lua-переменные (имеется доступ на запить в Lua State). Можно определять новые переменные из кода на С++. Эта функциональность, конечно, не будет полезной, когда Lua используется, как конфигурационный язык, но все таки это иногда бывает полезным. Код, приведенный ниже, показывает как это делается.&lt;/p&gt;
&lt;blockquote style="MARGIN-BOTTOM:0cm;"&gt;ls[&amp;quot;newNumber&amp;quot;] = -123.456;&lt;/blockquote&gt;
&lt;blockquote style="MARGIN-BOTTOM:0cm;"&gt;ls[&amp;quot;newString&amp;quot;] = &amp;quot;Ahhh!&amp;quot;;&lt;/blockquote&gt;
&lt;blockquote&gt;ls[&amp;quot;FavoritePiApproximation&amp;quot;] = 3.14159265;&lt;/blockquote&gt;
&lt;p style="MARGIN-BOTTOM:0cm;"&gt;&lt;strong&gt;&lt;i&gt;Обертки для С++ функций&lt;/i&gt;&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;Прежде всего, если так случилось что у нас есть lua_CFunction (Lua-функция, как она определяется в Lua API для С), мы можем попросту присвоить объекту &lt;a href="http://www.stackedboxes.org/Projects/Diluculum/Documentation/Doxygen/classDiluculum_1_1LuaState.html" target="_blank"&gt;&lt;font color="#000080"&gt;Diluculum::LuaState&lt;/font&gt;&lt;/a&gt; это значение, как показывается ниже.&lt;/p&gt;
&lt;blockquote style="MARGIN-BOTTOM:0cm;"&gt;int aLuaCFunction(lua_State * ls)&lt;/blockquote&gt;
&lt;blockquote style="MARGIN-BOTTOM:0cm;"&gt;{&lt;/blockquote&gt;
&lt;blockquote style="MARGIN-BOTTOM:0cm;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; //...&lt;br /&gt;}&lt;/blockquote&gt;
&lt;blockquote style="MARGIN-BOTTOM:0cm;"&gt;//...&lt;/blockquote&gt;
&lt;blockquote style="MARGIN-BOTTOM:0cm;"&gt;// Create a Lua state and register the function there&lt;/blockquote&gt;
&lt;blockquote style="MARGIN-BOTTOM:0cm;"&gt;Diluculum::LuaState ls;&lt;/blockquote&gt;
&lt;blockquote style="MARGIN-BOTTOM:0cm;"&gt;ls[&amp;quot;Func&amp;quot;] = aLuaCFunction;&lt;/blockquote&gt;
&lt;blockquote style="MARGIN-BOTTOM:0cm;"&gt;//Call the function from Lua&lt;/blockquote&gt;
&lt;blockquote&gt;ls.&lt;a href="http://www.stackedboxes.org/Projects/Diluculum/Documentation/Doxygen/classDiluculum_1_1LuaState.html#b12ccabf55443f96eb2c74676a3c8045" target="_blank"&gt;&lt;font color="#000080"&gt;doString&lt;/font&gt;&lt;/a&gt;(&amp;quot;Func(1, 2, 3, &amp;#39;four&amp;#39;)&amp;quot;);&lt;/blockquote&gt;
&lt;p&gt;Присваивание значений объекту типа lua_CFunction может вызвать нарушения доступа с использованием lua_State*, и может быть не совсем тем, что Вам необходимо (я бы сказал, что подобное использование противоречит принципу инкапсуляции ООП). Поэтому Diluculum позволяет создавать lua_CFunction автоматически, если ей подготовить функцию на С++, принимающую в качестве параметра и возвращающую в качестве значения объект класса Diluculum::LuaValueList (инкапсуляция списка Lua-значений). Затем такая функция должна быть зарегистрирована в объекте &lt;a href="http://www.stackedboxes.org/Projects/Diluculum/Documentation/Doxygen/classDiluculum_1_1LuaState.html" target="_blank"&gt;&lt;font color="#000080"&gt;Diluculum::LuaState&lt;/font&gt;&lt;/a&gt;, как показано ниже.&lt;/p&gt;
&lt;blockquote style="MARGIN-BOTTOM:0cm;"&gt;#include &amp;lt;&lt;a href="http://www.stackedboxes.org/Projects/Diluculum/Documentation/Doxygen/LuaWrappers_8hpp.html" target="_blank"&gt;&lt;font color="#000080"&gt;Diluculum/LuaWrappers.hpp&lt;/font&gt;&lt;/a&gt;&amp;gt;&lt;/blockquote&gt;
&lt;blockquote style="MARGIN-BOTTOM:0cm;"&gt;using namespace Diluculum;&lt;/blockquote&gt;
&lt;blockquote style="MARGIN-BOTTOM:0cm;"&gt;//...&lt;/blockquote&gt;
&lt;blockquote style="MARGIN-BOTTOM:0cm;"&gt;/* In Lua, this will take one number parameter and return three numbers, which are equal the parameter, two times the parameter and three times the parameter. Not very useful, uh? */&lt;/blockquote&gt;
&lt;blockquote style="MARGIN-BOTTOM:0cm;"&gt;LuaVauleList MyFunction(const LuaValueList &amp;amp; params)&lt;/blockquote&gt;
&lt;blockquote style="MARGIN-BOTTOM:0cm;"&gt;{&lt;/blockquote&gt;
&lt;blockquote style="MARGIN-BOTTOM:0cm;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; if ( (params.size() != 1) || (params[0].type() != LUA_TNUMBER) )&lt;/blockquote&gt;
&lt;blockquote style="MARGIN-BOTTOM:0cm;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; throw LuaError(&amp;quot;Bad parameters&amp;quot;);&lt;/blockquote&gt;
&lt;blockquote style="MARGIN-BOTTOM:0cm;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; LuaValueList ret;&lt;/blockquote&gt;
&lt;blockquote style="MARGIN-BOTTOM:0cm;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; double dVal = params[0].asNumber();&lt;/blockquote&gt;
&lt;blockquote style="MARGIN-BOTTOM:0cm;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; ret.push_back(dVal);&lt;/blockquote&gt;
&lt;blockquote style="MARGIN-BOTTOM:0cm;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; ret.push_back(dVal * 2);&lt;/blockquote&gt;
&lt;blockquote style="MARGIN-BOTTOM:0cm;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; ret.push_back(dVal * 3);&lt;/blockquote&gt;
&lt;blockquote style="MARGIN-BOTTOM:0cm;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; return ret;&lt;br /&gt;}&lt;/blockquote&gt;
&lt;blockquote style="MARGIN-BOTTOM:0cm;"&gt;// Create a &amp;#39;lua_CFunction&amp;#39;&lt;/blockquote&gt;
&lt;blockquote style="MARGIN-BOTTOM:0cm;"&gt;DILUCULUM_WRAP_FUNCTION(MyFunction);&lt;/blockquote&gt;
&lt;blockquote style="MARGIN-BOTTOM:0cm;"&gt;//...&lt;/blockquote&gt;
&lt;blockquote style="MARGIN-BOTTOM:0cm;"&gt;// Create&amp;nbsp;Lua State and register the function.&lt;/blockquote&gt;
&lt;blockquote style="MARGIN-BOTTOM:0cm;"&gt;LuaState ls;&lt;/blockquote&gt;
&lt;blockquote style="MARGIN-BOTTOM:0cm;"&gt;ls[&amp;quot;MyFunction&amp;quot;]&amp;nbsp;= DILUCULUM_WRAPPER_FUNCTION(MyFunction);&lt;/blockquote&gt;
&lt;blockquote style="MARGIN-BOTTOM:0cm;"&gt;// Now &amp;#39;MyFunction&amp;#39; can be called from Lua&lt;/blockquote&gt;
&lt;blockquote&gt;ls.doString(&amp;quot;a, b, c&amp;nbsp;= MyFunction(4.5)&amp;quot;);&lt;/blockquote&gt;
&lt;p style="MARGIN-BOTTOM:0cm;"&gt;Тут есть один важный момент в том, что выбрасывание &lt;a href="http://www.stackedboxes.org/Projects/Diluculum/Documentation/Doxygen/classDiluculum_1_1LuaError.html" target="_blank"&gt;&lt;font color="#000080"&gt;Diluculum::LuaError&lt;/font&gt;&lt;/a&gt; является корректным (я бы сказал, единственно корректным) способом сообщить об ошибочной ситуации наружу из обернутой таким способом функции. Для тех, кто уже знает Lua C API, сообщаем что это исключение обрабатывается и преобразуется в вызов lua_error(). (Тем, кто не знает Lua C API, можно особо не волноваться. Более гадкое, чем Lua C API, лично я встречаю редко [тьфу-тьфу-тьфу, по дереву постучать...]. Этим как раз и объясняется, что все более менее здоровые люди используют Lua через подобные библиотеки).&lt;/p&gt;
&lt;p style="MARGIN-BOTTOM:0cm;"&gt;&lt;strong&gt;&lt;i&gt;Обертки для классов и объектов С++&lt;/i&gt;&lt;/strong&gt;&lt;/p&gt;
&lt;p style="MARGIN-BOTTOM:0cm;"&gt;Diluculum имеет ограниценную поддержку для обертывания классов С++ и их объектов в Lua-совместимые, регистрируя их в Lua State соответствующим образом. Поддержка названа ограниченной, т.к. не поддерживается перенос наследования, например. Т.е. нет переноса объектной ориентированности, грубо говоря. Конструкции могут показаться громоздкими. Однако ж они могут пригодиться в хозяйстве.&lt;/p&gt;
&lt;p&gt;Diluculum не может справиться с произвольным классом. Как и в случае с функциями, классы надо подготовить. Оборачиваемые классы должны подчиняться нескольким правилам для того, чтобы быть использованными через Diluculum. Во-первых, должен существовать конструктор копирования, принимающий &lt;a href="http://www.stackedboxes.org/Projects/Diluculum/Documentation/Doxygen/namespaceDiluculum.html#42c98ce88a934306768ba5b0ab3e0bf0" target="_blank"&gt;&lt;font color="#000080"&gt;Diluculum::LuaValueList&lt;/font&gt;&lt;/a&gt;. Во-вторых, методы которые экспортируются в Lua, должны принимать &lt;a href="http://www.stackedboxes.org/Projects/Diluculum/Documentation/Doxygen/namespaceDiluculum.html#42c98ce88a934306768ba5b0ab3e0bf0" target="_blank"&gt;&lt;font color="#000080"&gt;Diluculum::LuaValueList&lt;/font&gt;&lt;/a&gt; в качестве параметра, а также возвращать объект того же типа. Ниже показан пример корректно обернутого класса.&lt;/p&gt;
&lt;blockquote style="MARGIN-BOTTOM:0cm;"&gt;&amp;nbsp;// A class that stores one value. Duh.&lt;/blockquote&gt;
&lt;blockquote style="MARGIN-BOTTOM:0cm;"&gt;class ValueBox&lt;/blockquote&gt;
&lt;blockquote style="MARGIN-BOTTOM:0cm;"&gt;{&lt;/blockquote&gt;
&lt;blockquote style="MARGIN-BOTTOM:0cm;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; private:&lt;/blockquote&gt;
&lt;blockquote style="MARGIN-BOTTOM:0cm;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;a href="http://www.stackedboxes.org/Projects/Diluculum/Documentation/Doxygen/classDiluculum_1_1LuaValue.html" target="_blank"&gt;&lt;font color="#000080"&gt;Diluculum::LuaValue&lt;/font&gt;&lt;/a&gt; value_;&lt;/blockquote&gt;
&lt;blockquote style="MARGIN-BOTTOM:0cm;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; public:&lt;/blockquote&gt;
&lt;blockquote style="MARGIN-BOTTOM:0cm;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; // The constructor taking a &amp;#39;Diluculum::LuaValueList&amp;#39; parameter.&lt;/blockquote&gt;
&lt;blockquote style="MARGIN-BOTTOM:0cm;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; ValueBox( const Diluculum::LuaValueList &amp;amp; params)&lt;/blockquote&gt;
&lt;blockquote style="MARGIN-BOTTOM:0cm;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;/blockquote&gt;
&lt;blockquote style="MARGIN-BOTTOM:0cm;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; if (params.size() &amp;gt; 0)&lt;/blockquote&gt;
&lt;blockquote style="MARGIN-BOTTOM:0cm;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; value_ = params[0];&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;/blockquote&gt;
&lt;blockquote style="MARGIN-BOTTOM:0cm;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; /* Stores the value passed as parameter in the box and returns the value previously stored there */&lt;/blockquote&gt;
&lt;blockquote style="MARGIN-BOTTOM:0cm;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; Diluculum::LuaValueList swap(const Diluculum::LuaValueList &amp;amp; params)&lt;/blockquote&gt;
&lt;blockquote style="MARGIN-BOTTOM:0cm;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;/blockquote&gt;
&lt;blockquote style="MARGIN-BOTTOM:0cm;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; if (params.size() != 1)&lt;/blockquote&gt;
&lt;blockquote style="MARGIN-BOTTOM:0cm;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; throw Diluculum::LuaError(&amp;quot;Exactly one parameter was expected.&amp;quot;);&lt;/blockquote&gt;
&lt;blockquote style="MARGIN-BOTTOM:0cm;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; Diluculum::LuaValueList ret;&lt;/blockquote&gt;
&lt;blockquote style="MARGIN-BOTTOM:0cm;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; ret.push_back(value_);&lt;/blockquote&gt;
&lt;blockquote style="MARGIN-BOTTOM:0cm;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; value_ = params[0];&lt;/blockquote&gt;
&lt;blockquote style="MARGIN-BOTTOM:0cm;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; return ret;&lt;/blockquote&gt;
&lt;blockquote&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;br /&gt;};&lt;/blockquote&gt;
&lt;p&gt;Как и в случае обернутых функций, единственным правильным способом донести об ошибочной ситуации является выброс &lt;a href="http://www.stackedboxes.org/Projects/Diluculum/Documentation/Doxygen/classDiluculum_1_1LuaError.html" target="_blank"&gt;&lt;font color="#000080"&gt;Diluculum::LuaError&lt;/font&gt;&lt;/a&gt;. Класс экспортируется в Lua через использование макросов, подставляющих необходимый код на Lua C API и определяющих некоторые структуры с данными. (Для читателей, интересующихся механизмом преобразования: библиотека создает глобальный объект &lt;a href="http://www.stackedboxes.org/Projects/Diluculum/Documentation/Doxygen/namespaceDiluculum.html#1e97e3b5307cbc940108ddb8d0e616d9" target="_blank"&gt;&lt;font color="#000080"&gt;Diluculum::LuaValueMap&lt;/font&gt;&lt;/a&gt;, представляющий класс и являющийся метатаблицей для объектов этого класса в Lua). Вот как выглядит регистрация класса на С++.&lt;/p&gt;
&lt;blockquote style="MARGIN-BOTTOM:0cm;"&gt;&lt;a href="http://www.stackedboxes.org/Projects/Diluculum/Documentation/Doxygen/LuaWrappers_8hpp.html#abc543a317b1623f2079f75155eb3a21" target="_blank"&gt;&lt;font color="#000080"&gt;DILUCULUM_BEGIN_CLASS&lt;/font&gt;&lt;/a&gt;(ValueBox);&lt;/blockquote&gt;
&lt;blockquote style="MARGIN-BOTTOM:0cm;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;a href="http://www.stackedboxes.org/Projects/Diluculum/Documentation/Doxygen/LuaWrappers_8hpp.html#20d9a08f1bbe4a54a2276cd7c2ecdd14" target="_blank"&gt;&lt;font color="#000080"&gt;DILUCULUM_CLASS_METHOD&lt;/font&gt;&lt;/a&gt;(ValueBox, swap);&lt;/blockquote&gt;
&lt;blockquote&gt;DILUCULUM_END_CLASS(ValueBox);&lt;/blockquote&gt;
&lt;p&gt;Имеется только одно использование макроса &lt;a href="http://www.stackedboxes.org/Projects/Diluculum/Documentation/Doxygen/LuaWrappers_8hpp.html#20d9a08f1bbe4a54a2276cd7c2ecdd14" target="_blank"&gt;&lt;font color="#000080"&gt;DILUCULUM_CLASS_METHOD()&lt;/font&gt;&lt;/a&gt;, т.к. в классе, что описан выше, имеется только один экспортируемый в Lua метод. Разумеется, можно добавлять произвольное количество методов. Теперь мы готовы к регистраци этого класса в Lua State, чтобы потом его использовать (это необходимо, иначе Lua &amp;quot;не увидит&amp;quot; Вашего класса, будет писать о синтаксических ошибках). Для этого требуется использовать еще один макрос. После этого объекты обернутого класса могут создаваться из Lua-кода. Код ниже демонстрирует сказанное.&lt;/p&gt;
&lt;blockquote style="MARGIN-BOTTOM:0cm;"&gt;Diluculum::LuaState ls;&lt;/blockquote&gt;
&lt;blockquote style="MARGIN-BOTTOM:0cm;"&gt;DILUCULUM_REGISTER_CLASS(ls[&amp;quot;ValueBox&amp;quot;], ValueBox);&lt;/blockquote&gt;
&lt;blockquote style="MARGIN-BOTTOM:0cm;"&gt;ls.doString(&amp;quot;box = ValueBox.new(3)&amp;quot;);&lt;/blockquote&gt;
&lt;blockquote style="MARGIN-BOTTOM:0cm;"&gt;ls.doString(&amp;quot;print(box:swap(&amp;#39;foo&amp;#39;))&amp;quot;);&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;// prints &amp;#39;3&amp;#39;&lt;/blockquote&gt;
&lt;blockquote&gt;ls.doString(&amp;quot;print(box:swap(789.987))&amp;quot;); // prints &amp;#39;foo&amp;#39;&lt;/blockquote&gt;
&lt;p style="MARGIN-BOTTOM:0cm;"&gt;&lt;strong&gt;&lt;i&gt;Управление памятью&lt;/i&gt;&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;В Lua имеется сборщик мусора, подобно .NET и Java. Когда объект С++, созданный из Lua, очищается из памяти сборщиком, вызывается его деструктор С++. Таким образом, ресурсы корректно освобождаются (конечно же, в предположении, что программист правильно написал деструктор). Тем не менее, имеется возможность заставить Lua вызвать деструктор явно, чтобы самому управлять процессом очистки. Ниже показывается соответствующий код.&lt;/p&gt;
&lt;blockquote style="MARGIN-BOTTOM:0cm;"&gt;Diluculum::LuaState ls;&lt;/blockquote&gt;
&lt;blockquote style="MARGIN-BOTTOM:0cm;"&gt;DILUCULUM_REGISTER_CLASS(ls[&amp;quot;ValueBox&amp;quot;], ValueBox);&lt;/blockquote&gt;
&lt;blockquote style="MARGIN-BOTTOM:0cm;"&gt;ls.doString(&amp;quot;box = ValueBox.new()&amp;quot;);&lt;/blockquote&gt;
&lt;blockquote style="MARGIN-BOTTOM:0cm;"&gt;// ... use &amp;#39;box&amp;#39; ...&lt;/blockquote&gt;
&lt;blockquote&gt;ls.doString(&amp;quot;box:delete()&amp;quot;);&lt;/blockquote&gt;
&lt;p style="MARGIN-BOTTOM:0cm;"&gt;Как раз время обсудить то, когда лучше самому заниматься очитсткой памяти. Проблема в том, что Lua не знает, сколько именно памяти занимает объект обернутого класса. Для каждого объекта, созданного с использованием возможностей Diluculum, Lua располагает лишь малой частью памяти (для соответствующего указателя и некоторых флагов). Если объект сам будет требовать выделения памяти (например, по ходу работы с ним), Lua не будет знать об этом, и сборщик мусора не будет знать как правильно и сколько именно очищать. Итак, если Вы создаете некий подобный большой объект, Вам лучше освобождать его вручную из Lua, когда он Вам больше не нужен. Аналогично, если Вы создаете много объектов, лучше освобождать их вручную.&lt;/p&gt;
&lt;p style="MARGIN-BOTTOM:0cm;"&gt;&lt;em&gt;&lt;strong&gt;Регистрация объектов&lt;/strong&gt;&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;Иногда требуется создать объект в С++ и сделать его доступным в Lua State. Другими словами, некто может создать объект в С++ и вызывать его методы из Lua. Это можно сделать с помощью &lt;a href="http://www.stackedboxes.org/Projects/Diluculum/Documentation/Doxygen/namespaceDiluculum.html" target="_blank"&gt;&lt;font color="#000080"&gt;Diluculum&lt;/font&gt;&lt;/a&gt;, используя еще один макрос, как показано ниже.&lt;/p&gt;
&lt;blockquote style="MARGIN-BOTTOM:0cm;"&gt;Diluculum::LuaState ls;&lt;/blockquote&gt;
&lt;blockquote style="MARGIN-BOTTOM:0cm;"&gt;Diluculum::LuaValueList params;&lt;/blockquote&gt;
&lt;blockquote style="MARGIN-BOTTOM:0cm;"&gt;ValueBox vb(params);&lt;/blockquote&gt;
&lt;blockquote style="MARGIN-BOTTOM:0cm;"&gt;DILUCULUM_REGISTER_OBJECT(ls[&amp;quot;box&amp;quot;], ValueBox, vb);&lt;/blockquote&gt;
&lt;blockquote style="MARGIN-BOTTOM:0cm;"&gt;ls.doString(&amp;quot;box:swap(123)&amp;quot;);&lt;/blockquote&gt;
&lt;blockquote&gt;cout &amp;lt;&amp;lt; vb.swap(&amp;quot;abc&amp;quot;) &amp;lt;&amp;lt; endl; // prints &amp;#39;123&amp;#39;&lt;/blockquote&gt;
&lt;p style="MARGIN-BOTTOM:0cm;"&gt;Заметим, что когда объект &amp;quot;box&amp;quot; обрабатывается сборщиком мусора, соответствующий объект С++ не будет удаляться (здесь он стековый). Удаление объекта из памяти является зоной ответственности программиста С++. (Другими словами, регистрация объектов только привязывает Lua-переменные с объетками С++ на время).&lt;/p&gt;
&lt;p style="MARGIN-BOTTOM:0cm;"&gt;&lt;em&gt;&lt;b&gt;Динамически загружаемые модули&lt;/b&gt;&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;Начиная с версии 0.4, Diluculum имеет возможности для создания динамически загружаемых Lua-модулей. Это модули, компилируемые в DLL и автоматически загружаемые по Lua-вызовам, как ниже.&lt;/p&gt;
&lt;blockquote&gt;require &amp;quot;MyModule&amp;quot;&lt;/blockquote&gt;
&lt;p style="MARGIN-BOTTOM:0cm;"&gt;На самом деле Diluculum проделывает совсем немного работы в этом плане, несильно упрощая жизнь программисту, если бы он использовал само Lua C API. В любом случае, т.к. эта документация для пользователей, то предполагается демонстрация того, как это можно использовать. Итак, поехали.&lt;/p&gt;
&lt;p&gt;По существу все, что мы можем сделать&amp;nbsp;— это создать модуль и добавить туда функций и классов. Вот пример того, как создать модуль, содержащий одну функцию и один класс, которые были определены выше.&lt;/p&gt;
&lt;blockquote style="MARGIN-BOTTOM:0cm;"&gt;DILUCULUM_BEGIN_MODULE(MyFineModule);&lt;/blockquote&gt;
&lt;blockquote style="MARGIN-BOTTOM:0cm;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; DILUCULUM_MODULE_ADD_CLASS(ValueBox, &amp;quot;ValueBox&amp;quot;);&lt;/blockquote&gt;
&lt;blockquote style="MARGIN-BOTTOM:0cm;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; DILUCULUM_MODULE_ADD_FUNCTION(DILUCULUM_WRAPPER_FUNCTION(MyFunction), &amp;quot;MyFunction&amp;quot;);&lt;/blockquote&gt;
&lt;blockquote&gt;&lt;a href="http://www.stackedboxes.org/Projects/Diluculum/Documentation/Doxygen/LuaWrappers_8hpp.html#27aa84e954125885247f6f3ef3a93480" target="_blank"&gt;&lt;font color="#000080"&gt;DILUCULUM_END_MODULE&lt;/font&gt;&lt;/a&gt;();&lt;/blockquote&gt;
&lt;p&gt;Так, если все это было скомпилировано в правильно названную DLL (см. &lt;a href="http://www.lua.org/docs.html" target="_blank"&gt;Lua&amp;#39;s Reference Manual&lt;/a&gt; чтобы знать, что&amp;nbsp;образует правильное имя модуля). Программист на Lua может написать нечто подобное.&lt;/p&gt;
&lt;blockquote style="MARGIN-BOTTOM:0cm;"&gt;require &amp;quot;MyFineModule&amp;quot;&lt;/blockquote&gt;
&lt;blockquote style="MARGIN-BOTTOM:0cm;"&gt;local v = MyFineModule.ValueBox.new(4321)&lt;/blockquote&gt;
&lt;blockquote style="MARGIN-BOTTOM:0cm;"&gt;v.swap(&amp;quot;Weeee!&amp;quot;)&lt;/blockquote&gt;
&lt;blockquote&gt;local x, y, z = MyFineModule.MyFunction(4.567)&lt;/blockquote&gt;&lt;img src="http://www.itkazan.com/aggbug.aspx?PostID=1603" width="1" height="1"&gt;</description><category domain="http://www.itkazan.com/blogs/dmitryshm/archive/tags/Lua/default.aspx">Lua</category><category domain="http://www.itkazan.com/blogs/dmitryshm/archive/tags/_41042B002B00_/default.aspx">с++</category><category domain="http://www.itkazan.com/blogs/dmitryshm/archive/tags/Diluculum/default.aspx">Diluculum</category></item></channel></rss>