<?xml version="1.0" encoding="UTF-8"?>
<?xml-stylesheet type="text/xsl" media="screen" href="/~d/styles/atom10full.xsl"?><?xml-stylesheet type="text/css" media="screen" href="http://feeds.feedburner.com/~d/styles/itemcontent.css"?><feed xmlns="http://www.w3.org/2005/Atom" xmlns:geo="http://www.w3.org/2003/01/geo/wgs84_pos#" xmlns:feedburner="http://rssnamespace.org/feedburner/ext/1.0">
 
 <title>Rubén’s blog</title>
 
 <link href="http://rubenlaguna.com/wp" />
 <updated>2012-12-11T08:24:57+01:00</updated>
 <id>http://rubenlaguna.com/wp</id>
 <author>
   <name>Rubén Laguna</name>
   <email>ruben.laguna@gmail.com</email>
 </author>

 
 <atom10:link xmlns:atom10="http://www.w3.org/2005/Atom" rel="self" type="application/atom+xml" href="http://feeds.feedburner.com/RubensBlog" /><feedburner:info uri="rubensblog" /><atom10:link xmlns:atom10="http://www.w3.org/2005/Atom" rel="hub" href="http://pubsubhubbub.appspot.com/" /><geo:lat>40.382644</geo:lat><geo:long>-3.77655</geo:long><entry xml:base="http://rubenlaguna.com/">
   <title>Accessing C++ objects from Lua</title>
   <link href="http://feedproxy.google.com/~r/RubensBlog/~3/cfyDtSPCWrE/" />
   <updated>2012-12-09T21:28:00+01:00</updated>
   <id>http://rubenlaguna.com/wp/2012/12/09/accessing-cpp-objects-from-lua</id>
   <content type="html">&lt;p&gt;Continuing the post about &lt;a href="http://rubenlaguna.com/wp/2012/11/26/first-steps-lua-cplusplus-integration/" title="First Steps in LUA-C++ Integration"&gt;lua integration with C++&lt;/a&gt;. Now to more serious stuff. Let&amp;#8217;s try to write a wrapper for a &lt;code&gt;std::list&amp;lt;int&amp;gt;&lt;/code&gt;. Imagine that you have a &lt;code&gt;std::list&amp;lt;int&amp;gt;&lt;/code&gt; in your C++ that you want to share with the Lua enviroment. So both C++ and Lua can access the list.&lt;/p&gt;

&lt;p&gt;Keep in mind, that I&amp;#8217;m going to use a &lt;code&gt;std::list&amp;lt;int&amp;gt;&lt;/code&gt; as an example but you could apply the same idea to any other type: user-defined or builtin.&lt;/p&gt;

&lt;h2&gt;Basics&lt;/h2&gt;

&lt;p&gt;First, let&amp;#8217;s get the &lt;code&gt;Makefile&lt;/code&gt; in place&lt;/p&gt;

&lt;figure class=’code’&gt; &lt;div class="highlight"&gt;&lt;table&gt;&lt;tr&gt;&lt;td class="gutter"&gt;&lt;pre class="line-numbers"&gt;&lt;span class=’line-number’&gt;1&lt;/span&gt;
&lt;span class=’line-number’&gt;2&lt;/span&gt;
&lt;span class=’line-number’&gt;3&lt;/span&gt;
&lt;span class=’line-number’&gt;4&lt;/span&gt;
&lt;span class=’line-number’&gt;5&lt;/span&gt;
&lt;span class=’line-number’&gt;6&lt;/span&gt;
&lt;/pre&gt;&lt;/td&gt;&lt;td class=’code’&gt;&lt;pre&gt;&lt;code class=’make’&gt;&lt;span class=’line’&gt;&lt;span class="nv"&gt;LUAHOME&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="k"&gt;$(&lt;/span&gt;HOME&lt;span class="k"&gt;)&lt;/span&gt;/tmp/lua-5.2.1/src
&lt;/span&gt;&lt;span class=’line’&gt;
&lt;/span&gt;&lt;span class=’line’&gt;all: sampleluahost
&lt;/span&gt;&lt;span class=’line’&gt;
&lt;/span&gt;&lt;span class=’line’&gt;sampleluahost: sampleluahost.cpp
&lt;/span&gt;&lt;span class=’line’&gt;  g++ -g sampleluahost.cpp -llua -L&lt;span class="k"&gt;$(&lt;/span&gt;LUAHOME&lt;span class="k"&gt;)&lt;/span&gt; -I&lt;span class="k"&gt;$(&lt;/span&gt;LUAHOME&lt;span class="k"&gt;)&lt;/span&gt; -o sampleluahost
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&lt;/div&gt;&lt;/figure&gt;


&lt;h2&gt;Lua script&lt;/h2&gt;

&lt;figure class=’code’&gt; &lt;div class="highlight"&gt;&lt;table&gt;&lt;tr&gt;&lt;td class="gutter"&gt;&lt;pre class="line-numbers"&gt;&lt;span class=’line-number’&gt;1&lt;/span&gt;
&lt;span class=’line-number’&gt;2&lt;/span&gt;
&lt;span class=’line-number’&gt;3&lt;/span&gt;
&lt;span class=’line-number’&gt;4&lt;/span&gt;
&lt;span class=’line-number’&gt;5&lt;/span&gt;
&lt;span class=’line-number’&gt;6&lt;/span&gt;
&lt;span class=’line-number’&gt;7&lt;/span&gt;
&lt;span class=’line-number’&gt;8&lt;/span&gt;
&lt;span class=’line-number’&gt;9&lt;/span&gt;
&lt;span class=’line-number’&gt;10&lt;/span&gt;
&lt;span class=’line-number’&gt;11&lt;/span&gt;
&lt;span class=’line-number’&gt;12&lt;/span&gt;
&lt;span class=’line-number’&gt;13&lt;/span&gt;
&lt;/pre&gt;&lt;/td&gt;&lt;td class=’code’&gt;&lt;pre&gt;&lt;code class=’lua’&gt;&lt;span class=’line’&gt;&lt;span class="k"&gt;function&lt;/span&gt; &lt;span class="nf"&gt;entries&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;arg&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="c1"&gt;– iterator&lt;/span&gt;
&lt;/span&gt;&lt;span class=’line’&gt;  &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="k"&gt;function&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
&lt;/span&gt;&lt;span class=’line’&gt;         &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="n"&gt;arg&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="n"&gt;pop&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;
&lt;/span&gt;&lt;span class=’line’&gt;         &lt;span class="k"&gt;end&lt;/span&gt;
&lt;/span&gt;&lt;span class=’line’&gt;&lt;span class="k"&gt;end&lt;/span&gt;
&lt;/span&gt;&lt;span class=’line’&gt;
&lt;/span&gt;&lt;span class=’line’&gt;&lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="n"&gt;i&lt;/span&gt; &lt;span class="k"&gt;in&lt;/span&gt; &lt;span class="n"&gt;entries&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;the_list&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="k"&gt;do&lt;/span&gt;
&lt;/span&gt;&lt;span class=’line’&gt;  &lt;span class="nb"&gt;io.write&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;&lt;/span&gt;&lt;span class="s"&gt;From LUA:  &amp;quot;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;i&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s2"&gt;&amp;quot;&lt;/span&gt;&lt;span class="se"&gt;\n&lt;/span&gt;&lt;span class="s"&gt;&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;span class=’line’&gt;&lt;span class="k"&gt;end&lt;/span&gt;
&lt;/span&gt;&lt;span class=’line’&gt;
&lt;/span&gt;&lt;span class=’line’&gt;&lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="n"&gt;i&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="mi"&gt;10&lt;/span&gt; &lt;span class="k"&gt;do&lt;/span&gt;
&lt;/span&gt;&lt;span class=’line’&gt;  &lt;span class="n"&gt;the_list&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="n"&gt;push&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;50&lt;/span&gt;&lt;span class="o"&gt;+&lt;/span&gt;&lt;span class="n"&gt;i&lt;/span&gt;&lt;span class="o"&gt;*&lt;/span&gt;&lt;span class="mi"&gt;100&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;/span&gt;&lt;span class=’line’&gt;&lt;span class="k"&gt;end&lt;/span&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&lt;/div&gt;&lt;/figure&gt;


&lt;p&gt;This script when executed will empty &lt;code&gt;the_list&lt;/code&gt; printing its contents and will fill it again with new content. That will illuestrate that Lua can access the underlyint &lt;code&gt;std::list&amp;lt;int&amp;gt;&lt;/code&gt; backing up &lt;code&gt;the_list&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;Note that we use the colon notation to call methods on &lt;code&gt;the_list&lt;/code&gt;. So when I write &lt;code&gt;arg:pop()&lt;/code&gt; it&amp;#8217;s tranlated to &lt;code&gt;arg.pop(arg)&lt;/code&gt;. The first argument to the function will be the object itself (Think on that argument like the implicit &lt;code&gt;*this&lt;/code&gt; in C++ methods or &lt;code&gt;self&lt;/code&gt; argument in python).&lt;/p&gt;

&lt;p&gt;Note: that I wrote an iterator for the list in lua. That is a function that returns  a closure. the &lt;code&gt;for&lt;/code&gt; will call this returned function over and over until it returns &lt;code&gt;nil&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;The &lt;code&gt;arg:pop()&lt;/code&gt; will pop a element from the front of the &lt;code&gt;std::list&amp;lt;int&amp;gt;&lt;/code&gt; and will return &lt;code&gt;nil&lt;/code&gt; when the list is empty.&lt;/p&gt;

&lt;h2&gt;The C++ host application&lt;/h2&gt;

&lt;figure class=’code’&gt;&lt;figcaption&gt;&lt;span&gt;++ &lt;/span&gt;&lt;/figcaption&gt;
 &lt;div class="highlight"&gt;&lt;table&gt;&lt;tr&gt;&lt;td class="gutter"&gt;&lt;pre class="line-numbers"&gt;&lt;span class=’line-number’&gt;1&lt;/span&gt;
&lt;span class=’line-number’&gt;2&lt;/span&gt;
&lt;span class=’line-number’&gt;3&lt;/span&gt;
&lt;span class=’line-number’&gt;4&lt;/span&gt;
&lt;span class=’line-number’&gt;5&lt;/span&gt;
&lt;span class=’line-number’&gt;6&lt;/span&gt;
&lt;span class=’line-number’&gt;7&lt;/span&gt;
&lt;span class=’line-number’&gt;8&lt;/span&gt;
&lt;span class=’line-number’&gt;9&lt;/span&gt;
&lt;span class=’line-number’&gt;10&lt;/span&gt;
&lt;span class=’line-number’&gt;11&lt;/span&gt;
&lt;span class=’line-number’&gt;12&lt;/span&gt;
&lt;span class=’line-number’&gt;13&lt;/span&gt;
&lt;span class=’line-number’&gt;14&lt;/span&gt;
&lt;span class=’line-number’&gt;15&lt;/span&gt;
&lt;span class=’line-number’&gt;16&lt;/span&gt;
&lt;span class=’line-number’&gt;17&lt;/span&gt;
&lt;span class=’line-number’&gt;18&lt;/span&gt;
&lt;span class=’line-number’&gt;19&lt;/span&gt;
&lt;span class=’line-number’&gt;20&lt;/span&gt;
&lt;span class=’line-number’&gt;21&lt;/span&gt;
&lt;span class=’line-number’&gt;22&lt;/span&gt;
&lt;span class=’line-number’&gt;23&lt;/span&gt;
&lt;span class=’line-number’&gt;24&lt;/span&gt;
&lt;span class=’line-number’&gt;25&lt;/span&gt;
&lt;span class=’line-number’&gt;26&lt;/span&gt;
&lt;span class=’line-number’&gt;27&lt;/span&gt;
&lt;span class=’line-number’&gt;28&lt;/span&gt;
&lt;span class=’line-number’&gt;29&lt;/span&gt;
&lt;span class=’line-number’&gt;30&lt;/span&gt;
&lt;span class=’line-number’&gt;31&lt;/span&gt;
&lt;span class=’line-number’&gt;32&lt;/span&gt;
&lt;span class=’line-number’&gt;33&lt;/span&gt;
&lt;span class=’line-number’&gt;34&lt;/span&gt;
&lt;span class=’line-number’&gt;35&lt;/span&gt;
&lt;span class=’line-number’&gt;36&lt;/span&gt;
&lt;span class=’line-number’&gt;37&lt;/span&gt;
&lt;span class=’line-number’&gt;38&lt;/span&gt;
&lt;span class=’line-number’&gt;39&lt;/span&gt;
&lt;span class=’line-number’&gt;40&lt;/span&gt;
&lt;span class=’line-number’&gt;41&lt;/span&gt;
&lt;span class=’line-number’&gt;42&lt;/span&gt;
&lt;span class=’line-number’&gt;43&lt;/span&gt;
&lt;span class=’line-number’&gt;44&lt;/span&gt;
&lt;span class=’line-number’&gt;45&lt;/span&gt;
&lt;span class=’line-number’&gt;46&lt;/span&gt;
&lt;span class=’line-number’&gt;47&lt;/span&gt;
&lt;span class=’line-number’&gt;48&lt;/span&gt;
&lt;span class=’line-number’&gt;49&lt;/span&gt;
&lt;span class=’line-number’&gt;50&lt;/span&gt;
&lt;span class=’line-number’&gt;51&lt;/span&gt;
&lt;span class=’line-number’&gt;52&lt;/span&gt;
&lt;span class=’line-number’&gt;53&lt;/span&gt;
&lt;span class=’line-number’&gt;54&lt;/span&gt;
&lt;span class=’line-number’&gt;55&lt;/span&gt;
&lt;span class=’line-number’&gt;56&lt;/span&gt;
&lt;span class=’line-number’&gt;57&lt;/span&gt;
&lt;span class=’line-number’&gt;58&lt;/span&gt;
&lt;span class=’line-number’&gt;59&lt;/span&gt;
&lt;span class=’line-number’&gt;60&lt;/span&gt;
&lt;span class=’line-number’&gt;61&lt;/span&gt;
&lt;span class=’line-number’&gt;62&lt;/span&gt;
&lt;span class=’line-number’&gt;63&lt;/span&gt;
&lt;span class=’line-number’&gt;64&lt;/span&gt;
&lt;span class=’line-number’&gt;65&lt;/span&gt;
&lt;span class=’line-number’&gt;66&lt;/span&gt;
&lt;span class=’line-number’&gt;67&lt;/span&gt;
&lt;span class=’line-number’&gt;68&lt;/span&gt;
&lt;span class=’line-number’&gt;69&lt;/span&gt;
&lt;span class=’line-number’&gt;70&lt;/span&gt;
&lt;span class=’line-number’&gt;71&lt;/span&gt;
&lt;span class=’line-number’&gt;72&lt;/span&gt;
&lt;span class=’line-number’&gt;73&lt;/span&gt;
&lt;span class=’line-number’&gt;74&lt;/span&gt;
&lt;span class=’line-number’&gt;75&lt;/span&gt;
&lt;span class=’line-number’&gt;76&lt;/span&gt;
&lt;span class=’line-number’&gt;77&lt;/span&gt;
&lt;span class=’line-number’&gt;78&lt;/span&gt;
&lt;span class=’line-number’&gt;79&lt;/span&gt;
&lt;span class=’line-number’&gt;80&lt;/span&gt;
&lt;span class=’line-number’&gt;81&lt;/span&gt;
&lt;span class=’line-number’&gt;82&lt;/span&gt;
&lt;span class=’line-number’&gt;83&lt;/span&gt;
&lt;span class=’line-number’&gt;84&lt;/span&gt;
&lt;span class=’line-number’&gt;85&lt;/span&gt;
&lt;span class=’line-number’&gt;86&lt;/span&gt;
&lt;span class=’line-number’&gt;87&lt;/span&gt;
&lt;span class=’line-number’&gt;88&lt;/span&gt;
&lt;span class=’line-number’&gt;89&lt;/span&gt;
&lt;span class=’line-number’&gt;90&lt;/span&gt;
&lt;span class=’line-number’&gt;91&lt;/span&gt;
&lt;span class=’line-number’&gt;92&lt;/span&gt;
&lt;span class=’line-number’&gt;93&lt;/span&gt;
&lt;span class=’line-number’&gt;94&lt;/span&gt;
&lt;span class=’line-number’&gt;95&lt;/span&gt;
&lt;span class=’line-number’&gt;96&lt;/span&gt;
&lt;span class=’line-number’&gt;97&lt;/span&gt;
&lt;/pre&gt;&lt;/td&gt;&lt;td class=’code’&gt;&lt;pre&gt;&lt;code class=’c’&gt;&lt;span class=’line’&gt;&lt;span class="cp"&gt;#include &amp;lt;lua.hpp&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;span class=’line’&gt;&lt;span class="cp"&gt;#include &amp;lt;iostream&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;span class=’line’&gt;&lt;span class="cp"&gt;#include &amp;lt;list&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;span class=’line’&gt;&lt;span class="cp"&gt;#include &amp;lt;assert.h&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;span class=’line’&gt;
&lt;/span&gt;&lt;span class=’line’&gt;&lt;span class="k"&gt;extern&lt;/span&gt; &lt;span class="s"&gt;&amp;quot;C&amp;quot;&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;span class=’line’&gt;  &lt;span class="k"&gt;static&lt;/span&gt; &lt;span class="kt"&gt;int&lt;/span&gt; &lt;span class="n"&gt;l_list_push&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;lua_State&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt;&lt;span class="n"&gt;L&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="c1"&gt;// Push elements from LUA&lt;/span&gt;
&lt;/span&gt;&lt;span class=’line’&gt;    &lt;span class="n"&gt;assert&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;lua_gettop&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;L&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;==&lt;/span&gt; &lt;span class="mi"&gt;2&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt; &lt;span class="c1"&gt;// check that the number of args is exactly 2 &lt;/span&gt;
&lt;/span&gt;&lt;span class=’line’&gt;    &lt;span class="n"&gt;std&lt;/span&gt;&lt;span class="o"&gt;::&lt;/span&gt;&lt;span class="n"&gt;list&lt;/span&gt;&lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="kt"&gt;int&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt; &lt;span class="o"&gt;**&lt;/span&gt;&lt;span class="n"&gt;ud&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;static_cast&lt;/span&gt;&lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="n"&gt;std&lt;/span&gt;&lt;span class="o"&gt;::&lt;/span&gt;&lt;span class="n"&gt;list&lt;/span&gt;&lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="kt"&gt;int&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt; &lt;span class="o"&gt;**&amp;gt;&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;luaL_checkudata&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;L&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s"&gt;&amp;quot;ListMT&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;));&lt;/span&gt; &lt;span class="c1"&gt;// first arg is the list&lt;/span&gt;
&lt;/span&gt;&lt;span class=’line’&gt;    &lt;span class="kt"&gt;int&lt;/span&gt; &lt;span class="n"&gt;v&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;luaL_checkint&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;L&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="mi"&gt;2&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt; &lt;span class="c1"&gt;// seconds argument is the integer to be pushed to the std::list&amp;lt;int&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;span class=’line’&gt;    &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="o"&gt;*&lt;/span&gt;&lt;span class="n"&gt;ud&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="n"&gt;push_back&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;v&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt; &lt;span class="c1"&gt;// perform the push on C++ object through the pointer stored in user data&lt;/span&gt;
&lt;/span&gt;&lt;span class=’line’&gt;    &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="c1"&gt;// we return 0 values in the lua stack&lt;/span&gt;
&lt;/span&gt;&lt;span class=’line’&gt;  &lt;span class="p"&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;span class=’line’&gt;  &lt;span class="k"&gt;static&lt;/span&gt; &lt;span class="kt"&gt;int&lt;/span&gt; &lt;span class="n"&gt;l_list_pop&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;lua_State&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt;&lt;span class="n"&gt;L&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;span class=’line’&gt;    &lt;span class="n"&gt;assert&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;lua_gettop&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;L&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;==&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt; &lt;span class="c1"&gt;// check that the number of args is exactly 1&lt;/span&gt;
&lt;/span&gt;&lt;span class=’line’&gt;    &lt;span class="n"&gt;std&lt;/span&gt;&lt;span class="o"&gt;::&lt;/span&gt;&lt;span class="n"&gt;list&lt;/span&gt;&lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="kt"&gt;int&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt; &lt;span class="o"&gt;**&lt;/span&gt;&lt;span class="n"&gt;ud&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;static_cast&lt;/span&gt;&lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="n"&gt;std&lt;/span&gt;&lt;span class="o"&gt;::&lt;/span&gt;&lt;span class="n"&gt;list&lt;/span&gt;&lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="kt"&gt;int&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt; &lt;span class="o"&gt;**&amp;gt;&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;luaL_checkudata&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;L&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s"&gt;&amp;quot;ListMT&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;));&lt;/span&gt; &lt;span class="c1"&gt;// first arg is the userdata&lt;/span&gt;
&lt;/span&gt;&lt;span class=’line’&gt;    &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="p"&gt;((&lt;/span&gt;&lt;span class="o"&gt;*&lt;/span&gt;&lt;span class="n"&gt;ud&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="n"&gt;empty&lt;/span&gt;&lt;span class="p"&gt;())&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;span class=’line’&gt;      &lt;span class="n"&gt;lua_pushnil&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;L&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;/span&gt;&lt;span class=’line’&gt;      &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="c1"&gt;// if list is empty the function will return nil&lt;/span&gt;
&lt;/span&gt;&lt;span class=’line’&gt;    &lt;span class="p"&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;span class=’line’&gt;    &lt;span class="n"&gt;lua_pushnumber&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;L&lt;/span&gt;&lt;span class="p"&gt;,(&lt;/span&gt;&lt;span class="o"&gt;*&lt;/span&gt;&lt;span class="n"&gt;ud&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="n"&gt;front&lt;/span&gt;&lt;span class="p"&gt;());&lt;/span&gt; &lt;span class="c1"&gt;// push the value to pop in the lua stack&lt;/span&gt;
&lt;/span&gt;&lt;span class=’line’&gt;                                      &lt;span class="c1"&gt;// it will be the return value of the function in lua&lt;/span&gt;
&lt;/span&gt;&lt;span class=’line’&gt;    &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="o"&gt;*&lt;/span&gt;&lt;span class="n"&gt;ud&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="n"&gt;pop_front&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt; &lt;span class="c1"&gt;// remove the value from the list&lt;/span&gt;
&lt;/span&gt;&lt;span class=’line’&gt;    &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="c1"&gt;//we return 1 value in the stack&lt;/span&gt;
&lt;/span&gt;&lt;span class=’line’&gt;  &lt;span class="p"&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;span class=’line’&gt;&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;span class=’line’&gt;&lt;span class="n"&gt;class&lt;/span&gt; &lt;span class="n"&gt;Main&lt;/span&gt;
&lt;/span&gt;&lt;span class=’line’&gt;&lt;span class="p"&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;span class=’line’&gt;&lt;span class="nl"&gt;public:&lt;/span&gt;
&lt;/span&gt;&lt;span class=’line’&gt;  &lt;span class="n"&gt;Main&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;
&lt;/span&gt;&lt;span class=’line’&gt;  &lt;span class="o"&gt;~&lt;/span&gt;&lt;span class="n"&gt;Main&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;
&lt;/span&gt;&lt;span class=’line’&gt;  &lt;span class="kt"&gt;void&lt;/span&gt; &lt;span class="n"&gt;run&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;
&lt;/span&gt;&lt;span class=’line’&gt;
&lt;/span&gt;&lt;span class=’line’&gt;  &lt;span class="cm"&gt;/* data */&lt;/span&gt;
&lt;/span&gt;&lt;span class=’line’&gt;&lt;span class="nl"&gt;private:&lt;/span&gt;
&lt;/span&gt;&lt;span class=’line’&gt;  &lt;span class="n"&gt;lua_State&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt;&lt;span class="n"&gt;L&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;/span&gt;&lt;span class=’line’&gt;  &lt;span class="n"&gt;std&lt;/span&gt;&lt;span class="o"&gt;::&lt;/span&gt;&lt;span class="n"&gt;list&lt;/span&gt;&lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="kt"&gt;int&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt; &lt;span class="n"&gt;theList&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;/span&gt;&lt;span class=’line’&gt;  &lt;span class="kt"&gt;void&lt;/span&gt; &lt;span class="n"&gt;registerListType&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;
&lt;/span&gt;&lt;span class=’line’&gt;  &lt;span class="kt"&gt;void&lt;/span&gt; &lt;span class="n"&gt;runScript&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;
&lt;/span&gt;&lt;span class=’line’&gt;&lt;span class="p"&gt;};&lt;/span&gt;
&lt;/span&gt;&lt;span class=’line’&gt;
&lt;/span&gt;&lt;span class=’line’&gt;&lt;span class="n"&gt;Main&lt;/span&gt;&lt;span class="o"&gt;::&lt;/span&gt;&lt;span class="n"&gt;Main&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;span class=’line’&gt;  &lt;span class="n"&gt;L&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;luaL_newstate&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;
&lt;/span&gt;&lt;span class=’line’&gt;  &lt;span class="n"&gt;luaL_openlibs&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;L&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;/span&gt;&lt;span class=’line’&gt;&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;span class=’line’&gt;
&lt;/span&gt;&lt;span class=’line’&gt;&lt;span class="n"&gt;Main&lt;/span&gt;&lt;span class="o"&gt;::~&lt;/span&gt;&lt;span class="n"&gt;Main&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;span class=’line’&gt;  &lt;span class="n"&gt;lua_close&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;L&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;/span&gt;&lt;span class=’line’&gt;&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;span class=’line’&gt;
&lt;/span&gt;&lt;span class=’line’&gt;&lt;span class="kt"&gt;void&lt;/span&gt; &lt;span class="n"&gt;Main&lt;/span&gt;&lt;span class="o"&gt;::&lt;/span&gt;&lt;span class="n"&gt;runScript&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;span class=’line’&gt;  &lt;span class="n"&gt;lua_settop&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;L&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt; &lt;span class="c1"&gt;//empty the lua stack&lt;/span&gt;
&lt;/span&gt;&lt;span class=’line’&gt;  &lt;span class="k"&gt;if&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;luaL_dofile&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;L&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s"&gt;&amp;quot;./samplescript.lua&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;span class=’line’&gt;    &lt;span class="n"&gt;fprintf&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;stderr&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s"&gt;&amp;quot;error: %s&lt;/span&gt;&lt;span class="se"&gt;\n&lt;/span&gt;&lt;span class="s"&gt;&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;lua_tostring&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;L&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;));&lt;/span&gt;
&lt;/span&gt;&lt;span class=’line’&gt;    &lt;span class="n"&gt;lua_pop&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;L&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;/span&gt;&lt;span class=’line’&gt;    &lt;span class="n"&gt;exit&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;/span&gt;&lt;span class=’line’&gt;  &lt;span class="p"&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;span class=’line’&gt;  &lt;span class="n"&gt;assert&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;lua_gettop&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;L&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt; &lt;span class="c1"&gt;//empty the lua stack&lt;/span&gt;
&lt;/span&gt;&lt;span class=’line’&gt;&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;span class=’line’&gt;
&lt;/span&gt;&lt;span class=’line’&gt;&lt;span class="kt"&gt;void&lt;/span&gt; &lt;span class="n"&gt;Main&lt;/span&gt;&lt;span class="o"&gt;::&lt;/span&gt;&lt;span class="n"&gt;registerListType&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;span class=’line’&gt;  &lt;span class="n"&gt;std&lt;/span&gt;&lt;span class="o"&gt;::&lt;/span&gt;&lt;span class="n"&gt;cout&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;&amp;lt;&lt;/span&gt; &lt;span class="s"&gt;&amp;quot;Set the list object in lua&amp;quot;&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;&amp;lt;&lt;/span&gt; &lt;span class="n"&gt;std&lt;/span&gt;&lt;span class="o"&gt;::&lt;/span&gt;&lt;span class="n"&gt;endl&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;/span&gt;&lt;span class=’line’&gt;  &lt;span class="n"&gt;luaL_newmetatable&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;L&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s"&gt;&amp;quot;ListMT&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;/span&gt;&lt;span class=’line’&gt;  &lt;span class="n"&gt;lua_pushvalue&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;L&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;/span&gt;&lt;span class=’line’&gt;  &lt;span class="n"&gt;lua_setfield&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;L&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="mi"&gt;2&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s"&gt;&amp;quot;__index&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt; &lt;span class="c1"&gt;// ListMT .__index = ListMT&lt;/span&gt;
&lt;/span&gt;&lt;span class=’line’&gt;  &lt;span class="n"&gt;lua_pushcfunction&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;L&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;l_list_push&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;/span&gt;&lt;span class=’line’&gt;  &lt;span class="n"&gt;lua_setfield&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;L&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="mi"&gt;2&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s"&gt;&amp;quot;push&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt; &lt;span class="c1"&gt;// push in lua will call l_list_push in C++&lt;/span&gt;
&lt;/span&gt;&lt;span class=’line’&gt;  &lt;span class="n"&gt;lua_pushcfunction&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;L&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;l_list_pop&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;/span&gt;&lt;span class=’line’&gt;  &lt;span class="n"&gt;lua_setfield&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;L&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="mi"&gt;2&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s"&gt;&amp;quot;pop&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt; &lt;span class="c1"&gt;// pop in lua will call l_list_pop in C++&lt;/span&gt;
&lt;/span&gt;&lt;span class=’line’&gt;&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;span class=’line’&gt;
&lt;/span&gt;&lt;span class=’line’&gt;&lt;span class="kt"&gt;void&lt;/span&gt; &lt;span class="n"&gt;Main&lt;/span&gt;&lt;span class="o"&gt;::&lt;/span&gt;&lt;span class="n"&gt;run&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;span class=’line’&gt;  &lt;span class="k"&gt;for&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="kt"&gt;unsigned&lt;/span&gt; &lt;span class="kt"&gt;int&lt;/span&gt; &lt;span class="n"&gt;i&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="n"&gt;i&lt;/span&gt;&lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="mi"&gt;10&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="n"&gt;i&lt;/span&gt;&lt;span class="o"&gt;++&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="c1"&gt;// add some input data to the list&lt;/span&gt;
&lt;/span&gt;&lt;span class=’line’&gt;    &lt;span class="n"&gt;theList&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;push_back&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;i&lt;/span&gt;&lt;span class="o"&gt;*&lt;/span&gt;&lt;span class="mi"&gt;100&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;/span&gt;&lt;span class=’line’&gt;  &lt;span class="n"&gt;registerListType&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;
&lt;/span&gt;&lt;span class=’line’&gt;  &lt;span class="n"&gt;std&lt;/span&gt;&lt;span class="o"&gt;::&lt;/span&gt;&lt;span class="n"&gt;cout&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;&amp;lt;&lt;/span&gt; &lt;span class="s"&gt;&amp;quot;creating an instance of std::list in lua&amp;quot;&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;&amp;lt;&lt;/span&gt; &lt;span class="n"&gt;std&lt;/span&gt;&lt;span class="o"&gt;::&lt;/span&gt;&lt;span class="n"&gt;endl&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;/span&gt;&lt;span class=’line’&gt;  &lt;span class="n"&gt;std&lt;/span&gt;&lt;span class="o"&gt;::&lt;/span&gt;&lt;span class="n"&gt;list&lt;/span&gt;&lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="kt"&gt;int&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt; &lt;span class="o"&gt;**&lt;/span&gt;&lt;span class="n"&gt;ud&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;static_cast&lt;/span&gt;&lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="n"&gt;std&lt;/span&gt;&lt;span class="o"&gt;::&lt;/span&gt;&lt;span class="n"&gt;list&lt;/span&gt;&lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="kt"&gt;int&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt; &lt;span class="o"&gt;**&amp;gt;&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;lua_newuserdata&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;L&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="k"&gt;sizeof&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;std&lt;/span&gt;&lt;span class="o"&gt;::&lt;/span&gt;&lt;span class="n"&gt;list&lt;/span&gt;&lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="kt"&gt;int&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt;&lt;span class="p"&gt;)));&lt;/span&gt;
&lt;/span&gt;&lt;span class=’line’&gt;  &lt;span class="o"&gt;*&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;ud&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="o"&gt;&amp;amp;&lt;/span&gt;&lt;span class="n"&gt;theList&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;/span&gt;&lt;span class=’line’&gt;  &lt;span class="n"&gt;luaL_setmetatable&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;L&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s"&gt;&amp;quot;ListMT&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt; &lt;span class="c1"&gt;// set userdata metatable&lt;/span&gt;
&lt;/span&gt;&lt;span class=’line’&gt;  &lt;span class="n"&gt;lua_setglobal&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;L&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s"&gt;&amp;quot;the_list&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt; &lt;span class="c1"&gt;// the_list in lua points to the new userdata&lt;/span&gt;
&lt;/span&gt;&lt;span class=’line’&gt;
&lt;/span&gt;&lt;span class=’line’&gt;  &lt;span class="n"&gt;runScript&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;
&lt;/span&gt;&lt;span class=’line’&gt;
&lt;/span&gt;&lt;span class=’line’&gt;  &lt;span class="k"&gt;while&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="o"&gt;!&lt;/span&gt;&lt;span class="n"&gt;theList&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;empty&lt;/span&gt;&lt;span class="p"&gt;())&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="c1"&gt;// read the data that lua left in the list&lt;/span&gt;
&lt;/span&gt;&lt;span class=’line’&gt;    &lt;span class="n"&gt;std&lt;/span&gt;&lt;span class="o"&gt;::&lt;/span&gt;&lt;span class="n"&gt;cout&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;&amp;lt;&lt;/span&gt; &lt;span class="s"&gt;&amp;quot;from C++: pop value &amp;quot;&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;&amp;lt;&lt;/span&gt; &lt;span class="n"&gt;theList&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;front&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;&amp;lt;&lt;/span&gt; &lt;span class="n"&gt;std&lt;/span&gt;&lt;span class="o"&gt;::&lt;/span&gt;&lt;span class="n"&gt;endl&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;/span&gt;&lt;span class=’line’&gt;    &lt;span class="n"&gt;theList&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;pop_front&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;
&lt;/span&gt;&lt;span class=’line’&gt;  &lt;span class="p"&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;span class=’line’&gt;
&lt;/span&gt;&lt;span class=’line’&gt;
&lt;/span&gt;&lt;span class=’line’&gt;&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;span class=’line’&gt;
&lt;/span&gt;&lt;span class=’line’&gt;&lt;span class="kt"&gt;int&lt;/span&gt; &lt;span class="n"&gt;main&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="kt"&gt;int&lt;/span&gt; &lt;span class="n"&gt;argc&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="kt"&gt;char&lt;/span&gt; &lt;span class="k"&gt;const&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt;&lt;span class="n"&gt;argv&lt;/span&gt;&lt;span class="p"&gt;[])&lt;/span&gt;
&lt;/span&gt;&lt;span class=’line’&gt;&lt;span class="p"&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;span class=’line’&gt;  &lt;span class="n"&gt;Main&lt;/span&gt; &lt;span class="n"&gt;m&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;/span&gt;&lt;span class=’line’&gt;  &lt;span class="n"&gt;m&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;run&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;
&lt;/span&gt;&lt;span class=’line’&gt;  &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;/span&gt;&lt;span class=’line’&gt;&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&lt;/div&gt;&lt;/figure&gt;


&lt;p&gt;The idea is to set up the basic lua enviroment thought the &lt;a href="http://www.lua.org/manual/5.2/manual.html#luaL_newstate"&gt;luaL_newstate&lt;/a&gt; and &lt;a href="http://www.lua.org/manual/5.2/manual.html#luaL_openlibs"&gt;luaL_openlibs&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;Then we create a metatable with &lt;a href="http://www.lua.org/manual/5.2/manual.html#luaL_newmetatable"&gt;luaL_newmetatable&lt;/a&gt;. A metatable is just a regular table that can be associated with lua values such as userdata. The metatable is where Lua goes to search for metamethods. You can see the list of available metamethods in &lt;a href="http://www.lua.org/manual/5.2/manual.html#2.4"&gt;Lua Reference&lt;/a&gt;. In this case we define the metamethod &lt;code&gt;__index&lt;/code&gt;, which is the metamethod used by Lua when in cannot find a given index in a table or userdata. So imagine that  &lt;code&gt;a&lt;/code&gt; is a userdata and we type &lt;code&gt;a.elem&lt;/code&gt;. &lt;code&gt;a&lt;/code&gt; has no &lt;code&gt;elem&lt;/code&gt; in it so it invokes &lt;code&gt;__index&lt;/code&gt; on a&amp;#8217;s metatable to see what to do. It&amp;#8217;s kind of &lt;code&gt;method_missing&lt;/code&gt; in Ruby if you are familiar with Ruby. Now the &lt;code&gt;__index&lt;/code&gt; metamethod it&amp;#8217;s a little bit special in the sense that I doesn&amp;#8217;t need to be a method/function at all. If Lua finds out that the &lt;code&gt;__index&lt;/code&gt; field of the metatable is actually a table and not a function it will just use that table to find the key. So going back to &lt;code&gt;a.elem&lt;/code&gt; example, that will be translated to &lt;code&gt;getmetatable(a)["__index"].elem&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;We will use the &lt;code&gt;"ListMT"&lt;/code&gt; metatable to hold the methods for lists. We associate the metatable entries for &lt;code&gt;push&lt;/code&gt; and &lt;code&gt;pop&lt;/code&gt; with two static C functions &lt;code&gt;l_list_push&lt;/code&gt; and &lt;code&gt;l_list_pop&lt;/code&gt;. This functions must be  of type &lt;code&gt;lua_CFunction&lt;/code&gt;. that is they should take a &lt;code&gt;lua_State *&lt;/code&gt; as paramter and return an integer. That&amp;#8217;s how the Lua communicates with C++, via the &lt;code&gt;lua_State&lt;/code&gt; and its stack.&lt;/p&gt;

&lt;p&gt;The functions themselves are quite straighforward. They must be defined as &lt;code&gt;extern "C"&lt;/code&gt; because Lua is compiled as a C library and it will call all the &lt;code&gt;lua_CFunction&lt;/code&gt; with a C linkage (that determines the order in which the function parameters will be pushed into the machine&amp;#8217;s stack, etc.) so we need to make sure that the function that we are generating here can be called from C.&lt;/p&gt;

&lt;p&gt;The function are designed so that the first parameters is always the &amp;#8220;object&amp;#8221; in this case a userdata of type &amp;#8220;ListMT&amp;#8221;. The lua function &lt;a href="http://www.lua.org/manual/5.2/manual.html#luaL_checkudata"&gt;luaL_checkudata&lt;/a&gt; will check that the metatable of the userdata matches and it will provide the pointer to the userdata. When Lua call the funciton the arguments to the functions are always pushed into the stack so that the first parameter lands on the stack position 1. So arguments are easy to address.&lt;/p&gt;

&lt;p&gt;Finally the Lua resources are freed with &lt;a href="http://www.lua.org/manual/5.2/manual.html#lua_close"&gt;lua_close&lt;/a&gt;.&lt;/p&gt;

&lt;h2&gt;Output&lt;/h2&gt;

&lt;figure class=’code’&gt;&lt;div class="highlight"&gt;&lt;table&gt;&lt;tr&gt;&lt;td class="gutter"&gt;&lt;pre class="line-numbers"&gt;&lt;span class=’line-number’&gt;1&lt;/span&gt;
&lt;span class=’line-number’&gt;2&lt;/span&gt;
&lt;span class=’line-number’&gt;3&lt;/span&gt;
&lt;span class=’line-number’&gt;4&lt;/span&gt;
&lt;span class=’line-number’&gt;5&lt;/span&gt;
&lt;span class=’line-number’&gt;6&lt;/span&gt;
&lt;span class=’line-number’&gt;7&lt;/span&gt;
&lt;span class=’line-number’&gt;8&lt;/span&gt;
&lt;span class=’line-number’&gt;9&lt;/span&gt;
&lt;span class=’line-number’&gt;10&lt;/span&gt;
&lt;span class=’line-number’&gt;11&lt;/span&gt;
&lt;span class=’line-number’&gt;12&lt;/span&gt;
&lt;span class=’line-number’&gt;13&lt;/span&gt;
&lt;span class=’line-number’&gt;14&lt;/span&gt;
&lt;span class=’line-number’&gt;15&lt;/span&gt;
&lt;span class=’line-number’&gt;16&lt;/span&gt;
&lt;span class=’line-number’&gt;17&lt;/span&gt;
&lt;span class=’line-number’&gt;18&lt;/span&gt;
&lt;span class=’line-number’&gt;19&lt;/span&gt;
&lt;span class=’line-number’&gt;20&lt;/span&gt;
&lt;span class=’line-number’&gt;21&lt;/span&gt;
&lt;span class=’line-number’&gt;22&lt;/span&gt;
&lt;/pre&gt;&lt;/td&gt;&lt;td class=’code’&gt;&lt;pre&gt;&lt;code class=”&gt;&lt;span class=’line’&gt;Set the list object in lua
&lt;/span&gt;&lt;span class=’line’&gt;creating an instance of std::list in lua
&lt;/span&gt;&lt;span class=’line’&gt;From LUA:  0
&lt;/span&gt;&lt;span class=’line’&gt;From LUA:  100
&lt;/span&gt;&lt;span class=’line’&gt;From LUA:  200
&lt;/span&gt;&lt;span class=’line’&gt;From LUA:  300
&lt;/span&gt;&lt;span class=’line’&gt;From LUA:  400
&lt;/span&gt;&lt;span class=’line’&gt;From LUA:  500
&lt;/span&gt;&lt;span class=’line’&gt;From LUA:  600
&lt;/span&gt;&lt;span class=’line’&gt;From LUA:  700
&lt;/span&gt;&lt;span class=’line’&gt;From LUA:  800
&lt;/span&gt;&lt;span class=’line’&gt;From LUA:  900
&lt;/span&gt;&lt;span class=’line’&gt;from C++: pop value 150
&lt;/span&gt;&lt;span class=’line’&gt;from C++: pop value 250
&lt;/span&gt;&lt;span class=’line’&gt;from C++: pop value 350
&lt;/span&gt;&lt;span class=’line’&gt;from C++: pop value 450
&lt;/span&gt;&lt;span class=’line’&gt;from C++: pop value 550
&lt;/span&gt;&lt;span class=’line’&gt;from C++: pop value 650
&lt;/span&gt;&lt;span class=’line’&gt;from C++: pop value 750
&lt;/span&gt;&lt;span class=’line’&gt;from C++: pop value 850
&lt;/span&gt;&lt;span class=’line’&gt;from C++: pop value 950
&lt;/span&gt;&lt;span class=’line’&gt;from C++: pop value 1050&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&lt;/div&gt;&lt;/figure&gt;


&lt;h3&gt;Things to remember&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;Understand userdata, metatables and metamethods&lt;/li&gt;
&lt;li&gt;Lua and C++ communicate though the Lua stack&lt;/li&gt;
&lt;li&gt;check the number of arguments with `assert(lua_gettop(L) == x);&lt;/li&gt;
&lt;li&gt;empty the lua stack or assert that it&amp;#8217;s empty where do you know that the stack should be empty&lt;/li&gt;
&lt;/ul&gt;

&lt;img src="http://feeds.feedburner.com/~r/RubensBlog/~4/cfyDtSPCWrE" height="1" width="1"/&gt;</content>
 <feedburner:origLink>http://rubenlaguna.com/wp/2012/12/09/accessing-cpp-objects-from-lua/</feedburner:origLink></entry>
 
 <entry xml:base="http://rubenlaguna.com/">
   <title>Sublime Text 2 integration with RVM and Rspec: Take number 2</title>
   <link href="http://feedproxy.google.com/~r/RubensBlog/~3/tkUrP_ALa28/" />
   <updated>2012-12-07T21:28:00+01:00</updated>
   <id>http://rubenlaguna.com/wp/2012/12/07/sublime-rvm-rspec-take-two</id>
   <content type="html">&lt;p&gt;On a &lt;a href="/wp/2012/02/01/sublime-text-2-rvm-rspec/"&gt;previous post&lt;/a&gt; I&amp;#8217;ve talk about how to get &lt;a href="http://sublimetext.com"&gt;Sublime Text 2&lt;/a&gt; to honor the &lt;code&gt;.rvmrc&lt;/code&gt; files when executing both regular ruby and rspec.&lt;/p&gt;

&lt;p&gt;The solution described there, as pointed out in in &lt;a href="http://rubenlaguna.com/wp/2012/02/01/sublime-text-2-rvm-rspec/index.html#comment-605225107"&gt;the comments&lt;/a&gt;, is non-optimal.&lt;/p&gt;

&lt;p&gt;Correcting the old post seemed like a lot of work so I will prefer to post something new.&lt;/p&gt;

&lt;p&gt;Ok, so you are using Sublime Text 2 and you can use &lt;code&gt;Cmd-B&lt;/code&gt; to execute ruby code, but that ruby code won&amp;#8217;t be executed using under the environment dictated by the &lt;code&gt;.rvmrc&lt;/code&gt; in the project which is a pity. The same goes for RSpec, where you usually want to use &lt;code&gt;bundle exec rspec&lt;/code&gt; in addition to &lt;code&gt;.rvmrc&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;I&amp;#8217;m going to talk first on how to get regular ruby + &lt;a href="https://rvm.io/"&gt;RVM&lt;/a&gt; from Sublime Text 2 and then I&amp;#8217;ll jump onto executing &lt;a href="https://www.relishapp.com/rspec"&gt;RSpec&lt;/a&gt; together with RVM and &lt;a href="http://gembundler.com/"&gt;Bundler&lt;/a&gt; from Sublime Text 2.&lt;/p&gt;

&lt;h2&gt;Ruby&lt;/h2&gt;

&lt;p&gt;Well this one it&amp;#8217;s very easy. You just need to update &lt;code&gt;~/Library/Application\ Support/Sublime\ Text\ 2/Packages/Ruby/Ruby.sublime-build&lt;/code&gt; to look like&lt;/p&gt;

&lt;figure class=’code’&gt; &lt;div class="highlight"&gt;&lt;table&gt;&lt;tr&gt;&lt;td class="gutter"&gt;&lt;pre class="line-numbers"&gt;&lt;span class=’line-number’&gt;1&lt;/span&gt;
&lt;span class=’line-number’&gt;2&lt;/span&gt;
&lt;span class=’line-number’&gt;3&lt;/span&gt;
&lt;span class=’line-number’&gt;4&lt;/span&gt;
&lt;span class=’line-number’&gt;5&lt;/span&gt;
&lt;span class=’line-number’&gt;6&lt;/span&gt;
&lt;span class=’line-number’&gt;7&lt;/span&gt;
&lt;span class=’line-number’&gt;8&lt;/span&gt;
&lt;/pre&gt;&lt;/td&gt;&lt;td class=’code’&gt;&lt;pre&gt;&lt;code class=’json’&gt;&lt;span class=’line’&gt;&lt;span class="p"&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;span class=’line’&gt;  &lt;span class="nt"&gt;&amp;quot;env&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;:{&lt;/span&gt;
&lt;/span&gt;&lt;span class=’line’&gt;      &lt;span class="nt"&gt;&amp;quot;PATH&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;${HOME}/.rvm/bin:${PATH}&amp;quot;&lt;/span&gt;
&lt;/span&gt;&lt;span class=’line’&gt;  &lt;span class="p"&gt;},&lt;/span&gt;
&lt;/span&gt;&lt;span class=’line’&gt;  &lt;span class="nt"&gt;&amp;quot;cmd&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;rvm-auto-ruby&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s2"&gt;&amp;quot;$file&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt;
&lt;/span&gt;&lt;span class=’line’&gt;  &lt;span class="nt"&gt;&amp;quot;file_regex&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;&amp;quot;^(…*?):([0-9]*):?([0-9]*)&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;span class=’line’&gt;  &lt;span class="nt"&gt;&amp;quot;selector&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;&amp;quot;source.ruby&amp;quot;&lt;/span&gt;
&lt;/span&gt;&lt;span class=’line’&gt;&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&lt;/div&gt;&lt;/figure&gt;


&lt;p&gt;The &lt;code&gt;env&lt;/code&gt; part will add &lt;code&gt;rvm-auto-ruby&lt;/code&gt; into the &lt;code&gt;$PATH&lt;/code&gt; and the &lt;code&gt;cmd&lt;/code&gt; will execute &lt;code&gt;rvm-auto-ruby yourfile.rb&lt;/code&gt; when you press &lt;code&gt;Cmd-B&lt;/code&gt;. You and add options in between rvm-auto-ruby if you want, like this `&amp;#8221;cmd&amp;#8221;: [&amp;#8220;rvm-auto-ruby&amp;#8221;, &amp;#8220;-S&amp;#8221;,  &amp;#8220;$file&amp;#8221;].&lt;/p&gt;

&lt;p&gt;So that&amp;#8217;s it. Now you can just &lt;code&gt;Cmd-B&lt;/code&gt; a file and it will use &lt;code&gt;rvm-auto-ruby&lt;/code&gt; to run it and that will use the settings in the &lt;code&gt;.rvmrc&lt;/code&gt; file, running the specific version/flavor of ruby of your choice (MRI-1.8.7, MRI-1.9.3, etc).&lt;/p&gt;

&lt;h2&gt;Rspec&lt;/h2&gt;

&lt;p&gt;If you are using &lt;a href="https://rvm.io"&gt;RVM&lt;/a&gt;, it&amp;#8217;s very likely that you are using &lt;a href="http://gembundler.com"&gt;bundler&lt;/a&gt; too. And then, executing your test from Sublime Text 2 won&amp;#8217;t work as expected because you really need to execute &lt;code&gt;bundle exec rspec&lt;/code&gt; instead of just &lt;code&gt;rspec&lt;/code&gt; to make sure that all the gems versions specified in in your bundle (Gemfile) are visible in your enviroment prior to executing rspec.&lt;/p&gt;

&lt;p&gt;In order to do that you need to do some modification to the package that you use to run the RSpecs&lt;/p&gt;

&lt;h3&gt;Sublime Package: RSpec&lt;/h3&gt;

&lt;p&gt;If you use &lt;a href="https://github.com/SublimeText/RSpec"&gt;RSpec package&lt;/a&gt; (You can install it with &lt;a href="http://wbond.net/sublime_packages/package_control/installation"&gt;Package Manager&lt;/a&gt;) then you can run your rspec with &lt;code&gt;Cmd-B&lt;/code&gt; (asumming that you changed already the builder of your project to Rspec, with Tools/Build System/RSpec). But that will execute just rspec without RVM and without bundler. So to get RVM and bundler into play change the &lt;code&gt;~/Library/Application\ Support/Sublime\ Text\ 2/Packages/RSpec/RSpec.sublime-build&lt;/code&gt; like this&lt;/p&gt;

&lt;figure class=’code’&gt; &lt;div class="highlight"&gt;&lt;table&gt;&lt;tr&gt;&lt;td class="gutter"&gt;&lt;pre class="line-numbers"&gt;&lt;span class=’line-number’&gt;1&lt;/span&gt;
&lt;span class=’line-number’&gt;2&lt;/span&gt;
&lt;span class=’line-number’&gt;3&lt;/span&gt;
&lt;span class=’line-number’&gt;4&lt;/span&gt;
&lt;span class=’line-number’&gt;5&lt;/span&gt;
&lt;span class=’line-number’&gt;6&lt;/span&gt;
&lt;span class=’line-number’&gt;7&lt;/span&gt;
&lt;span class=’line-number’&gt;8&lt;/span&gt;
&lt;span class=’line-number’&gt;9&lt;/span&gt;
&lt;span class=’line-number’&gt;10&lt;/span&gt;
&lt;span class=’line-number’&gt;11&lt;/span&gt;
&lt;span class=’line-number’&gt;12&lt;/span&gt;
&lt;span class=’line-number’&gt;13&lt;/span&gt;
&lt;span class=’line-number’&gt;14&lt;/span&gt;
&lt;/pre&gt;&lt;/td&gt;&lt;td class=’code’&gt;&lt;pre&gt;&lt;code class=’json’&gt;&lt;span class=’line’&gt;&lt;span class="p"&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;span class=’line’&gt;  &lt;span class="nt"&gt;&amp;quot;env&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;:{&lt;/span&gt;
&lt;/span&gt;&lt;span class=’line’&gt;      &lt;span class="nt"&gt;&amp;quot;PATH&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;${HOME}/.rvm/bin:${PATH}&amp;quot;&lt;/span&gt;
&lt;/span&gt;&lt;span class=’line’&gt;  &lt;span class="p"&gt;},&lt;/span&gt;
&lt;/span&gt;&lt;span class=’line’&gt;  &lt;span class="nt"&gt;&amp;quot;cmd&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;rvm-auto-ruby&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;-S&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s2"&gt;&amp;quot;bundle&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s2"&gt;&amp;quot;exec&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s2"&gt;&amp;quot;rspec&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s2"&gt;&amp;quot;-I ${file_path}&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s2"&gt;&amp;quot;$file&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt;
&lt;/span&gt;&lt;span class=’line’&gt;  &lt;span class="nt"&gt;&amp;quot;file_regex&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;&amp;quot;# ([A-Za-z:0-9_./ ]+rb):([0-9]+)&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;span class=’line’&gt;  &lt;span class="nt"&gt;&amp;quot;working_dir&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;&amp;quot;${project_path}&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;span class=’line’&gt;  &lt;span class="nt"&gt;&amp;quot;selector&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;&amp;quot;source.ruby&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;span class=’line’&gt;
&lt;/span&gt;&lt;span class=’line’&gt;  &lt;span class="nt"&gt;&amp;quot;windows&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
&lt;/span&gt;&lt;span class=’line’&gt;  &lt;span class="p"&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;span class=’line’&gt;      &lt;span class="nt"&gt;&amp;quot;cmd&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;rspec.bat&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s2"&gt;&amp;quot;-I ${file_path}&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s2"&gt;&amp;quot;$file&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;
&lt;/span&gt;&lt;span class=’line’&gt;  &lt;span class="p"&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;span class=’line’&gt;&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&lt;/div&gt;&lt;/figure&gt;


&lt;p&gt;Just a matter of changing &lt;code&gt;"cmd"&lt;/code&gt; to run &lt;code&gt;rvm-auto-ruby -S bundle exec rspec&lt;/code&gt; instead of just &lt;code&gt;rspec&lt;/code&gt;. That will use the ruby from RVM to run &lt;code&gt;bundle exec rspec&lt;/code&gt;.&lt;/p&gt;

&lt;h3&gt;Sublime Package: RubyTest&lt;/h3&gt;

&lt;p&gt;I&amp;#8217;m assuming that you already used &lt;a href="http://wbond.net/sublime_packages/package_control"&gt;Package Control&lt;/a&gt; to install &lt;a href="https://github.com/maltize/sublime-text-2-ruby-tests"&gt;RubyTest&lt;/a&gt; so that you can use &lt;code&gt;Cmd-Shift-R&lt;/code&gt; / &lt;code&gt;Cmd-Shift-T&lt;/code&gt; to execute rspec test.&lt;/p&gt;

&lt;p&gt;Open  &lt;code&gt;~/Library/Application\ Support/Sublime\ Text\ 2/Packages/RubyTest/RubyTest.sublime-settings&lt;/code&gt; and edit it to look like this&lt;/p&gt;

&lt;figure class=’code’&gt; &lt;div class="highlight"&gt;&lt;table&gt;&lt;tr&gt;&lt;td class="gutter"&gt;&lt;pre class="line-numbers"&gt;&lt;span class=’line-number’&gt;1&lt;/span&gt;
&lt;span class=’line-number’&gt;2&lt;/span&gt;
&lt;span class=’line-number’&gt;3&lt;/span&gt;
&lt;span class=’line-number’&gt;4&lt;/span&gt;
&lt;span class=’line-number’&gt;5&lt;/span&gt;
&lt;span class=’line-number’&gt;6&lt;/span&gt;
&lt;span class=’line-number’&gt;7&lt;/span&gt;
&lt;span class=’line-number’&gt;8&lt;/span&gt;
&lt;span class=’line-number’&gt;9&lt;/span&gt;
&lt;span class=’line-number’&gt;10&lt;/span&gt;
&lt;span class=’line-number’&gt;11&lt;/span&gt;
&lt;span class=’line-number’&gt;12&lt;/span&gt;
&lt;span class=’line-number’&gt;13&lt;/span&gt;
&lt;span class=’line-number’&gt;14&lt;/span&gt;
&lt;span class=’line-number’&gt;15&lt;/span&gt;
&lt;span class=’line-number’&gt;16&lt;/span&gt;
&lt;span class=’line-number’&gt;17&lt;/span&gt;
&lt;span class=’line-number’&gt;18&lt;/span&gt;
&lt;span class=’line-number’&gt;19&lt;/span&gt;
&lt;span class=’line-number’&gt;20&lt;/span&gt;
&lt;span class=’line-number’&gt;21&lt;/span&gt;
&lt;span class=’line-number’&gt;22&lt;/span&gt;
&lt;span class=’line-number’&gt;23&lt;/span&gt;
&lt;span class=’line-number’&gt;24&lt;/span&gt;
&lt;span class=’line-number’&gt;25&lt;/span&gt;
&lt;span class=’line-number’&gt;26&lt;/span&gt;
&lt;span class=’line-number’&gt;27&lt;/span&gt;
&lt;span class=’line-number’&gt;28&lt;/span&gt;
&lt;span class=’line-number’&gt;29&lt;/span&gt;
&lt;/pre&gt;&lt;/td&gt;&lt;td class=’code’&gt;&lt;pre&gt;&lt;code class=’json’&gt;&lt;span class=’line’&gt;&lt;span class="p"&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;span class=’line’&gt;  &lt;span class="nt"&gt;&amp;quot;env&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;:{&lt;/span&gt;
&lt;/span&gt;&lt;span class=’line’&gt;    &lt;span class="nt"&gt;&amp;quot;PATH&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;${HOME}/.rvm/bin:${PATH}&amp;quot;&lt;/span&gt;
&lt;/span&gt;&lt;span class=’line’&gt;  &lt;span class="p"&gt;},&lt;/span&gt;
&lt;/span&gt;&lt;span class=’line’&gt;  &lt;span class="nt"&gt;&amp;quot;erb_verify_command&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;&amp;quot;erb -xT - {file_name} | ruby -c&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;span class=’line’&gt;  &lt;span class="nt"&gt;&amp;quot;ruby_verify_command&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;&amp;quot;ruby -c {file_name}&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;span class=’line’&gt;
&lt;/span&gt;&lt;span class=’line’&gt;  &lt;span class="nt"&gt;&amp;quot;run_ruby_unit_command&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;&amp;quot;ruby -Itest {relative_path}&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;span class=’line’&gt;  &lt;span class="nt"&gt;&amp;quot;run_single_ruby_unit_command&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;&amp;quot;ruby -Itest {relative_path} -n &amp;#39;{test_name}&amp;#39;&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;span class=’line’&gt;
&lt;/span&gt;&lt;span class=’line’&gt;  &lt;span class="nt"&gt;&amp;quot;run_cucumber_command&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;&amp;quot;rvm-auto-ruby -S bundle exec cucumber {relative_path}&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;span class=’line’&gt;  &lt;span class="nt"&gt;&amp;quot;run_single_cucumber_command&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;&amp;quot;rvm-auto-ruby -S bundle exec cucumber {relative_path} -l{line_number}&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;span class=’line’&gt;
&lt;/span&gt;&lt;span class=’line’&gt;  &lt;span class="nt"&gt;&amp;quot;run_rspec_command&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;&amp;quot;rvm-auto-ruby -S bundle exec rspec {relative_path}&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;span class=’line’&gt;  &lt;span class="nt"&gt;&amp;quot;run_single_rspec_command&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;&amp;quot;rvm-auto-ruby -S bundle exec rspec {relative_path} -l{line_number}&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;span class=’line’&gt;
&lt;/span&gt;&lt;span class=’line’&gt;  &lt;span class="nt"&gt;&amp;quot;ruby_unit_folder&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;&amp;quot;test&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;span class=’line’&gt;  &lt;span class="nt"&gt;&amp;quot;ruby_cucumber_folder&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;&amp;quot;features&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;span class=’line’&gt;  &lt;span class="nt"&gt;&amp;quot;ruby_rspec_folder&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;&amp;quot;spec&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;span class=’line’&gt;
&lt;/span&gt;&lt;span class=’line’&gt;  &lt;span class="nt"&gt;&amp;quot;ruby_use_scratch&amp;quot;&lt;/span&gt; &lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kc"&gt;false&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;span class=’line’&gt;  &lt;span class="nt"&gt;&amp;quot;save_on_run&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kc"&gt;false&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;span class=’line’&gt;  &lt;span class="nt"&gt;&amp;quot;ignored_directories&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;.git&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s2"&gt;&amp;quot;vendor&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s2"&gt;&amp;quot;tmp&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt;
&lt;/span&gt;&lt;span class=’line’&gt;
&lt;/span&gt;&lt;span class=’line’&gt;  &lt;span class="nt"&gt;&amp;quot;hide_panel&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kc"&gt;false&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;span class=’line’&gt;
&lt;/span&gt;&lt;span class=’line’&gt;  &lt;span class="nt"&gt;&amp;quot;before_callback&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;&amp;quot;&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;span class=’line’&gt;  &lt;span class="nt"&gt;&amp;quot;after_callback&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;&amp;quot;&amp;quot;&lt;/span&gt;
&lt;/span&gt;&lt;span class=’line’&gt;&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&lt;/div&gt;&lt;/figure&gt;


&lt;p&gt;Here I&amp;#8217;ve only edited the &lt;code&gt;"run_rspec_command"&lt;/code&gt; but you can use the same philosophy for the rest of the commands (&lt;code&gt;run_ruby_unit_command&lt;/code&gt;, etc) if you plan to use them.&lt;/p&gt;

&lt;p&gt;The idea is that instead of running &lt;code&gt;rspec {relative_path}&lt;/code&gt; you run &lt;code&gt;rvm-auto-ruby -S bundle exec rspec {relative_path}&lt;/code&gt;. the &lt;code&gt;rvm-auto-ruby&lt;/code&gt; part loads the RVM and the &lt;code&gt;bundle exec&lt;/code&gt; part makes sure that you use bundler to load your gems (including maybe a specific version of RSpec itself, if it&amp;#8217;s included in the Gemfile).&lt;/p&gt;
&lt;img src="http://feeds.feedburner.com/~r/RubensBlog/~4/tkUrP_ALa28" height="1" width="1"/&gt;</content>
 <feedburner:origLink>http://rubenlaguna.com/wp/2012/12/07/sublime-text-2-rvm-rspec-take-2/</feedburner:origLink></entry>
 
 <entry xml:base="http://rubenlaguna.com/">
   <title>GDB posix_spawn failed on Mac OS X Mountain Lion</title>
   <link href="http://feedproxy.google.com/~r/RubensBlog/~3/wTf3MbF8H9I/" />
   <updated>2012-11-28T07:13:00+01:00</updated>
   <id>http://rubenlaguna.com/wp/2012/11/28/gdb-posix-spawn-failed</id>
   <content type="html">&lt;p&gt;If you can&amp;#8217;t debug with &lt;code&gt;ddd&lt;/code&gt; or &lt;code&gt;gdb&lt;/code&gt; on Mac OS X Mountain Lion due to &lt;code&gt;posix_spawn failed&lt;/code&gt; error then just run &lt;code&gt;sudo gdb&lt;/code&gt; or &lt;code&gt;sudo ddd&lt;/code&gt; instead.&lt;/p&gt;

&lt;p&gt;The complete error message is&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;(gdb) run
Starting program: /Users/ecerulm/projects/luaqueue/test 
warning: posix_spawn failed, trying execvp, error: 2
Cannot exec /home/ecerulm/local/bin/zsh -c  exec /usr/bin/arch -arch x86_64 /Users/ecerulm/projects/luaqueue/test .
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;and after running it as &lt;code&gt;sudo gdb&lt;/code&gt; the error is gone&lt;/p&gt;
&lt;img src="http://feeds.feedburner.com/~r/RubensBlog/~4/wTf3MbF8H9I" height="1" width="1"/&gt;</content>
 <feedburner:origLink>http://rubenlaguna.com/wp/2012/11/28/gdb-posix-spawn-macosx/</feedburner:origLink></entry>
 
 <entry xml:base="http://rubenlaguna.com/">
   <title>First steps in LUA-C++ integration</title>
   <link href="http://feedproxy.google.com/~r/RubensBlog/~3/dLYnReT7yQA/" />
   <updated>2012-11-26T00:00:00+01:00</updated>
   <id>http://rubenlaguna.com/wp/2012/11/26/First-steps-in-LUA-C++-integration</id>
   <content type="html">&lt;p&gt;EDIT: &lt;a href="/wp/2012/12/09/accessing-cpp-objects-from-lua/"&gt;Part 2&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Long time without posting, busy at work, family, etc.&lt;/p&gt;

&lt;p&gt;Today I decided to write a bit on &lt;a href="http://lua.org"&gt;Lua&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;Lua is a scripting language with an emphasis on being easily embeddable. Lua is used as the scripting language in Photoshop CS, and World of Warcraft, for example. So if you are looking into adding scriptability to your C or C++ applications Lua is quite suited for the task.&lt;/p&gt;

&lt;p&gt;In order to learn Lua (both the language itself and how to embed it into your app) I recommend you &lt;a href="http://store.feistyduck.com/products/programming-in-lua"&gt;Programming in Lua&lt;/a&gt; by one of the Lua authors.&lt;/p&gt;

&lt;p&gt;You can find tons of tutorials on how to get started with Lua. So I will focus here on how to integrate with C++. Most of the sources I&amp;#8217;ve found about Lua - C++ integrations take the approach of frameworks to automatically wrap your objects/classes to be usable from within Lua. I find this approach confusing, I think it&amp;#8217;s better to learn how to do it manually, and that&amp;#8217;s what I will do here.&lt;/p&gt;

&lt;h2&gt;Step 0. Compile Lua itself&lt;/h2&gt;

&lt;p&gt;Download Lua 5.2.1 and compile it. Usually it enough with &lt;code&gt;make macosx&lt;/code&gt; or &lt;code&gt;make linux&lt;/code&gt;. That will generate &lt;code&gt;liblua.a&lt;/code&gt;, the library that we will link to.&lt;/p&gt;

&lt;h2&gt;Step 1. Create a simple host app&lt;/h2&gt;

&lt;p&gt;We need a simple host app. Our host app will simply setup Lua and run a script from it. This script will have access to a &lt;code&gt;std::queue&lt;/code&gt; from the host app. This will illustrate how you can share objects with the Lua part. Later we will take a more complex example.&lt;/p&gt;

&lt;p&gt;Let&amp;#8217;s start with the  basic skeleton of a lua environment with some communication with its host:&lt;/p&gt;

&lt;h3&gt;The Makefile&lt;/h3&gt;

&lt;figure class=’code’&gt;&lt;figcaption&gt;&lt;span&gt; (Makefile)&lt;/span&gt; &lt;a href=’/downloads/code/lua01/Makefile’&gt;download&lt;/a&gt;&lt;/figcaption&gt;
 &lt;div class="highlight"&gt;&lt;table&gt;&lt;tr&gt;&lt;td class="gutter"&gt;&lt;pre class="line-numbers"&gt;&lt;span class=’line-number’&gt;1&lt;/span&gt;
&lt;span class=’line-number’&gt;2&lt;/span&gt;
&lt;span class=’line-number’&gt;3&lt;/span&gt;
&lt;span class=’line-number’&gt;4&lt;/span&gt;
&lt;/pre&gt;&lt;/td&gt;&lt;td class=’code’&gt;&lt;pre&gt;&lt;code class=’makefile’&gt;&lt;span class=’line’&gt;&lt;span class="nv"&gt;LUAHOME&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="k"&gt;$(&lt;/span&gt;HOME&lt;span class="k"&gt;)&lt;/span&gt;/tmp/lua-5.2.1/src
&lt;/span&gt;&lt;span class=’line’&gt;all: sampleluahost
&lt;/span&gt;&lt;span class=’line’&gt;sampleluahost: sampleluahost.cpp
&lt;/span&gt;&lt;span class=’line’&gt;  g++ -g sampleluahost.cpp -llua -L&lt;span class="k"&gt;$(&lt;/span&gt;LUAHOME&lt;span class="k"&gt;)&lt;/span&gt; -I&lt;span class="k"&gt;$(&lt;/span&gt;LUAHOME&lt;span class="k"&gt;)&lt;/span&gt; -o sampleluahost
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&lt;/div&gt;&lt;/figure&gt;


&lt;p&gt;It uses &lt;code&gt;LUAHOME&lt;/code&gt; that should point to the directory containing both &lt;code&gt;liblua.a&lt;/code&gt; and the &lt;code&gt;lua*.h&lt;/code&gt; files.&lt;/p&gt;

&lt;h3&gt;The samplehost application&lt;/h3&gt;

&lt;figure class=’code’&gt;&lt;figcaption&gt;&lt;span&gt; (sampleluahost.cpp)&lt;/span&gt; &lt;a href=’/downloads/code/lua01/sampleluahost.cpp’&gt;download&lt;/a&gt;&lt;/figcaption&gt;
 &lt;div class="highlight"&gt;&lt;table&gt;&lt;tr&gt;&lt;td class="gutter"&gt;&lt;pre class="line-numbers"&gt;&lt;span class=’line-number’&gt;1&lt;/span&gt;
&lt;span class=’line-number’&gt;2&lt;/span&gt;
&lt;span class=’line-number’&gt;3&lt;/span&gt;
&lt;span class=’line-number’&gt;4&lt;/span&gt;
&lt;span class=’line-number’&gt;5&lt;/span&gt;
&lt;span class=’line-number’&gt;6&lt;/span&gt;
&lt;span class=’line-number’&gt;7&lt;/span&gt;
&lt;span class=’line-number’&gt;8&lt;/span&gt;
&lt;span class=’line-number’&gt;9&lt;/span&gt;
&lt;span class=’line-number’&gt;10&lt;/span&gt;
&lt;span class=’line-number’&gt;11&lt;/span&gt;
&lt;span class=’line-number’&gt;12&lt;/span&gt;
&lt;span class=’line-number’&gt;13&lt;/span&gt;
&lt;span class=’line-number’&gt;14&lt;/span&gt;
&lt;span class=’line-number’&gt;15&lt;/span&gt;
&lt;span class=’line-number’&gt;16&lt;/span&gt;
&lt;span class=’line-number’&gt;17&lt;/span&gt;
&lt;span class=’line-number’&gt;18&lt;/span&gt;
&lt;span class=’line-number’&gt;19&lt;/span&gt;
&lt;span class=’line-number’&gt;20&lt;/span&gt;
&lt;span class=’line-number’&gt;21&lt;/span&gt;
&lt;span class=’line-number’&gt;22&lt;/span&gt;
&lt;span class=’line-number’&gt;23&lt;/span&gt;
&lt;span class=’line-number’&gt;24&lt;/span&gt;
&lt;span class=’line-number’&gt;25&lt;/span&gt;
&lt;span class=’line-number’&gt;26&lt;/span&gt;
&lt;span class=’line-number’&gt;27&lt;/span&gt;
&lt;span class=’line-number’&gt;28&lt;/span&gt;
&lt;span class=’line-number’&gt;29&lt;/span&gt;
&lt;span class=’line-number’&gt;30&lt;/span&gt;
&lt;span class=’line-number’&gt;31&lt;/span&gt;
&lt;span class=’line-number’&gt;32&lt;/span&gt;
&lt;span class=’line-number’&gt;33&lt;/span&gt;
&lt;span class=’line-number’&gt;34&lt;/span&gt;
&lt;span class=’line-number’&gt;35&lt;/span&gt;
&lt;span class=’line-number’&gt;36&lt;/span&gt;
&lt;span class=’line-number’&gt;37&lt;/span&gt;
&lt;span class=’line-number’&gt;38&lt;/span&gt;
&lt;span class=’line-number’&gt;39&lt;/span&gt;
&lt;span class=’line-number’&gt;40&lt;/span&gt;
&lt;span class=’line-number’&gt;41&lt;/span&gt;
&lt;span class=’line-number’&gt;42&lt;/span&gt;
&lt;span class=’line-number’&gt;43&lt;/span&gt;
&lt;span class=’line-number’&gt;44&lt;/span&gt;
&lt;span class=’line-number’&gt;45&lt;/span&gt;
&lt;span class=’line-number’&gt;46&lt;/span&gt;
&lt;span class=’line-number’&gt;47&lt;/span&gt;
&lt;span class=’line-number’&gt;48&lt;/span&gt;
&lt;span class=’line-number’&gt;49&lt;/span&gt;
&lt;span class=’line-number’&gt;50&lt;/span&gt;
&lt;span class=’line-number’&gt;51&lt;/span&gt;
&lt;span class=’line-number’&gt;52&lt;/span&gt;
&lt;span class=’line-number’&gt;53&lt;/span&gt;
&lt;span class=’line-number’&gt;54&lt;/span&gt;
&lt;span class=’line-number’&gt;55&lt;/span&gt;
&lt;span class=’line-number’&gt;56&lt;/span&gt;
&lt;span class=’line-number’&gt;57&lt;/span&gt;
&lt;span class=’line-number’&gt;58&lt;/span&gt;
&lt;span class=’line-number’&gt;59&lt;/span&gt;
&lt;span class=’line-number’&gt;60&lt;/span&gt;
&lt;span class=’line-number’&gt;61&lt;/span&gt;
&lt;span class=’line-number’&gt;62&lt;/span&gt;
&lt;span class=’line-number’&gt;63&lt;/span&gt;
&lt;span class=’line-number’&gt;64&lt;/span&gt;
&lt;span class=’line-number’&gt;65&lt;/span&gt;
&lt;span class=’line-number’&gt;66&lt;/span&gt;
&lt;span class=’line-number’&gt;67&lt;/span&gt;
&lt;/pre&gt;&lt;/td&gt;&lt;td class=’code’&gt;&lt;pre&gt;&lt;code class=’cpp’&gt;&lt;span class=’line’&gt;&lt;span class="cp"&gt;#include &amp;lt;iostream&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;span class=’line’&gt;&lt;span class="cp"&gt;#include &amp;lt;lua.hpp&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;span class=’line’&gt;
&lt;/span&gt;&lt;span class=’line’&gt;
&lt;/span&gt;&lt;span class=’line’&gt;&lt;span class="k"&gt;extern&lt;/span&gt; &lt;span class="s"&gt;&amp;quot;C&amp;quot;&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;span class=’line’&gt;  &lt;span class="k"&gt;static&lt;/span&gt; &lt;span class="kt"&gt;int&lt;/span&gt; &lt;span class="n"&gt;l_cppfunction&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;lua_State&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt;&lt;span class="n"&gt;L&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;span class=’line’&gt;    &lt;span class="kt"&gt;double&lt;/span&gt; &lt;span class="n"&gt;arg&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;luaL_checknumber&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;L&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;/span&gt;&lt;span class=’line’&gt;    &lt;span class="n"&gt;lua_pushnumber&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;L&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;arg&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt; &lt;span class="mf"&gt;0.5&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;/span&gt;&lt;span class=’line’&gt;    &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;/span&gt;&lt;span class=’line’&gt;  &lt;span class="p"&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;span class=’line’&gt;&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;span class=’line’&gt;
&lt;/span&gt;&lt;span class=’line’&gt;&lt;span class="k"&gt;using&lt;/span&gt; &lt;span class="k"&gt;namespace&lt;/span&gt; &lt;span class="n"&gt;std&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;/span&gt;&lt;span class=’line’&gt;&lt;span class="kt"&gt;int&lt;/span&gt; &lt;span class="n"&gt;main&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
&lt;/span&gt;&lt;span class=’line’&gt;&lt;span class="p"&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;span class=’line’&gt;  &lt;span class="n"&gt;cout&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;&amp;lt;&lt;/span&gt; &lt;span class="s"&gt;&amp;quot;** Test Lua embedding&amp;quot;&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;&amp;lt;&lt;/span&gt; &lt;span class="n"&gt;endl&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;/span&gt;&lt;span class=’line’&gt;  &lt;span class="n"&gt;cout&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;&amp;lt;&lt;/span&gt; &lt;span class="s"&gt;&amp;quot;** Init Lua&amp;quot;&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;&amp;lt;&lt;/span&gt; &lt;span class="n"&gt;endl&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;/span&gt;&lt;span class=’line’&gt;  &lt;span class="n"&gt;lua_State&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt;&lt;span class="n"&gt;L&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;/span&gt;&lt;span class=’line’&gt;  &lt;span class="n"&gt;L&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;luaL_newstate&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;
&lt;/span&gt;&lt;span class=’line’&gt;  &lt;span class="n"&gt;cout&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;&amp;lt;&lt;/span&gt; &lt;span class="s"&gt;&amp;quot;** Load the (optional) standard libraries, to have the print function&amp;quot;&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;&amp;lt;&lt;/span&gt; &lt;span class="n"&gt;endl&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;/span&gt;&lt;span class=’line’&gt;  &lt;span class="n"&gt;luaL_openlibs&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;L&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;/span&gt;&lt;span class=’line’&gt;  &lt;span class="n"&gt;cout&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;&amp;lt;&lt;/span&gt; &lt;span class="s"&gt;&amp;quot;** Load chunk. without executing it&amp;quot;&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;&amp;lt;&lt;/span&gt; &lt;span class="n"&gt;endl&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;/span&gt;&lt;span class=’line’&gt;  &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;luaL_loadfile&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;L&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s"&gt;&amp;quot;luascript.lua&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;span class=’line’&gt;    &lt;span class="n"&gt;cerr&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;&amp;lt;&lt;/span&gt; &lt;span class="s"&gt;&amp;quot;Something went wrong loading the chunk (syntax error?)&amp;quot;&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;&amp;lt;&lt;/span&gt; &lt;span class="n"&gt;endl&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;/span&gt;&lt;span class=’line’&gt;    &lt;span class="n"&gt;cerr&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;&amp;lt;&lt;/span&gt; &lt;span class="n"&gt;lua_tostring&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;L&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;&amp;lt;&lt;/span&gt; &lt;span class="n"&gt;endl&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;/span&gt;&lt;span class=’line’&gt;    &lt;span class="n"&gt;lua_pop&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;L&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;/span&gt;&lt;span class=’line’&gt;  &lt;span class="p"&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;span class=’line’&gt;
&lt;/span&gt;&lt;span class=’line’&gt;  &lt;span class="n"&gt;cout&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;&amp;lt;&lt;/span&gt; &lt;span class="s"&gt;&amp;quot;** Make a insert a global var into Lua from C++&amp;quot;&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;&amp;lt;&lt;/span&gt; &lt;span class="n"&gt;endl&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;/span&gt;&lt;span class=’line’&gt;  &lt;span class="n"&gt;lua_pushnumber&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;L&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mf"&gt;1.1&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;/span&gt;&lt;span class=’line’&gt;  &lt;span class="n"&gt;lua_setglobal&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;L&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s"&gt;&amp;quot;cppvar&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;/span&gt;&lt;span class=’line’&gt;
&lt;/span&gt;&lt;span class=’line’&gt;  &lt;span class="n"&gt;cout&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;&amp;lt;&lt;/span&gt; &lt;span class="s"&gt;&amp;quot;** Execute the Lua chunk&amp;quot;&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;&amp;lt;&lt;/span&gt; &lt;span class="n"&gt;endl&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;/span&gt;&lt;span class=’line’&gt;  &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;lua_pcall&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;L&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;LUA_MULTRET&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;span class=’line’&gt;    &lt;span class="n"&gt;cerr&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;&amp;lt;&lt;/span&gt; &lt;span class="s"&gt;&amp;quot;Something went wrong during execution&amp;quot;&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;&amp;lt;&lt;/span&gt; &lt;span class="n"&gt;endl&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;/span&gt;&lt;span class=’line’&gt;    &lt;span class="n"&gt;cerr&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;&amp;lt;&lt;/span&gt; &lt;span class="n"&gt;lua_tostring&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;L&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;&amp;lt;&lt;/span&gt; &lt;span class="n"&gt;endl&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;/span&gt;&lt;span class=’line’&gt;    &lt;span class="n"&gt;lua_pop&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;L&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;/span&gt;&lt;span class=’line’&gt;  &lt;span class="p"&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;span class=’line’&gt;
&lt;/span&gt;&lt;span class=’line’&gt;  &lt;span class="n"&gt;cout&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;&amp;lt;&lt;/span&gt; &lt;span class="s"&gt;&amp;quot;** Read a global var from Lua into C++&amp;quot;&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;&amp;lt;&lt;/span&gt; &lt;span class="n"&gt;endl&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;/span&gt;&lt;span class=’line’&gt;  &lt;span class="n"&gt;lua_getglobal&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;L&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s"&gt;&amp;quot;luavar&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;/span&gt;&lt;span class=’line’&gt;  &lt;span class="kt"&gt;double&lt;/span&gt; &lt;span class="n"&gt;luavar&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;lua_tonumber&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;L&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;/span&gt;&lt;span class=’line’&gt;  &lt;span class="n"&gt;lua_pop&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;L&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;/span&gt;&lt;span class=’line’&gt;  &lt;span class="n"&gt;cout&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;&amp;lt;&lt;/span&gt; &lt;span class="s"&gt;&amp;quot;C++ can read the value set from Lua luavar = &amp;quot;&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;&amp;lt;&lt;/span&gt; &lt;span class="n"&gt;luavar&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;&amp;lt;&lt;/span&gt; &lt;span class="n"&gt;endl&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;/span&gt;&lt;span class=’line’&gt;
&lt;/span&gt;&lt;span class=’line’&gt;  &lt;span class="n"&gt;cout&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;&amp;lt;&lt;/span&gt; &lt;span class="s"&gt;&amp;quot;** Execute a Lua function from C++&amp;quot;&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;&amp;lt;&lt;/span&gt; &lt;span class="n"&gt;endl&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;/span&gt;&lt;span class=’line’&gt;  &lt;span class="n"&gt;lua_getglobal&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;L&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s"&gt;&amp;quot;myluafunction&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;/span&gt;&lt;span class=’line’&gt;  &lt;span class="n"&gt;lua_pushnumber&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;L&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;5&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;/span&gt;&lt;span class=’line’&gt;  &lt;span class="n"&gt;lua_pcall&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;L&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;/span&gt;&lt;span class=’line’&gt;  &lt;span class="n"&gt;cout&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;&amp;lt;&lt;/span&gt; &lt;span class="s"&gt;&amp;quot;The return value of the function was &amp;quot;&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;&amp;lt;&lt;/span&gt; &lt;span class="n"&gt;lua_tostring&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;L&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;&amp;lt;&lt;/span&gt; &lt;span class="n"&gt;endl&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;/span&gt;&lt;span class=’line’&gt;  &lt;span class="n"&gt;lua_pop&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;L&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;/span&gt;&lt;span class=’line’&gt;
&lt;/span&gt;&lt;span class=’line’&gt;  &lt;span class="n"&gt;cout&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;&amp;lt;&lt;/span&gt; &lt;span class="s"&gt;&amp;quot;** Execute a C++ function from Lua&amp;quot;&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;&amp;lt;&lt;/span&gt; &lt;span class="n"&gt;endl&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;/span&gt;&lt;span class=’line’&gt;  &lt;span class="n"&gt;cout&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;&amp;lt;&lt;/span&gt; &lt;span class="s"&gt;&amp;quot;**** First register the function in Lua&amp;quot;&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;&amp;lt;&lt;/span&gt; &lt;span class="n"&gt;endl&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;/span&gt;&lt;span class=’line’&gt;  &lt;span class="n"&gt;lua_pushcfunction&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;L&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="n"&gt;l_cppfunction&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;/span&gt;&lt;span class=’line’&gt;  &lt;span class="n"&gt;lua_setglobal&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;L&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s"&gt;&amp;quot;cppfunction&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;/span&gt;&lt;span class=’line’&gt;
&lt;/span&gt;&lt;span class=’line’&gt;  &lt;span class="n"&gt;cout&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;&amp;lt;&lt;/span&gt; &lt;span class="s"&gt;&amp;quot;**** Call a Lua function that uses the C++ function&amp;quot;&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;&amp;lt;&lt;/span&gt; &lt;span class="n"&gt;endl&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;/span&gt;&lt;span class=’line’&gt;  &lt;span class="n"&gt;lua_getglobal&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;L&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s"&gt;&amp;quot;myfunction&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;/span&gt;&lt;span class=’line’&gt;  &lt;span class="n"&gt;lua_pushnumber&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;L&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;5&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;/span&gt;&lt;span class=’line’&gt;  &lt;span class="n"&gt;lua_pcall&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;L&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;/span&gt;&lt;span class=’line’&gt;  &lt;span class="n"&gt;cout&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;&amp;lt;&lt;/span&gt; &lt;span class="s"&gt;&amp;quot;The return value of the function was &amp;quot;&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;&amp;lt;&lt;/span&gt; &lt;span class="n"&gt;lua_tonumber&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;L&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;&amp;lt;&lt;/span&gt; &lt;span class="n"&gt;endl&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;/span&gt;&lt;span class=’line’&gt;  &lt;span class="n"&gt;lua_pop&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;L&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;/span&gt;&lt;span class=’line’&gt;
&lt;/span&gt;&lt;span class=’line’&gt;  &lt;span class="n"&gt;cout&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;&amp;lt;&lt;/span&gt; &lt;span class="s"&gt;&amp;quot;** Release the Lua enviroment&amp;quot;&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;&amp;lt;&lt;/span&gt; &lt;span class="n"&gt;endl&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;/span&gt;&lt;span class=’line’&gt;  &lt;span class="n"&gt;lua_close&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;L&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;/span&gt;&lt;span class=’line’&gt;&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&lt;/div&gt;&lt;/figure&gt;


&lt;figure class=’code’&gt;&lt;figcaption&gt;&lt;span&gt; (luascript.lua)&lt;/span&gt; &lt;a href=’/downloads/code/lua01/luascript.lua’&gt;download&lt;/a&gt;&lt;/figcaption&gt;
 &lt;div class="highlight"&gt;&lt;table&gt;&lt;tr&gt;&lt;td class="gutter"&gt;&lt;pre class="line-numbers"&gt;&lt;span class=’line-number’&gt;1&lt;/span&gt;
&lt;span class=’line-number’&gt;2&lt;/span&gt;
&lt;span class=’line-number’&gt;3&lt;/span&gt;
&lt;span class=’line-number’&gt;4&lt;/span&gt;
&lt;span class=’line-number’&gt;5&lt;/span&gt;
&lt;span class=’line-number’&gt;6&lt;/span&gt;
&lt;span class=’line-number’&gt;7&lt;/span&gt;
&lt;span class=’line-number’&gt;8&lt;/span&gt;
&lt;span class=’line-number’&gt;9&lt;/span&gt;
&lt;span class=’line-number’&gt;10&lt;/span&gt;
&lt;span class=’line-number’&gt;11&lt;/span&gt;
&lt;/pre&gt;&lt;/td&gt;&lt;td class=’code’&gt;&lt;pre&gt;&lt;code class=’lua’&gt;&lt;span class=’line’&gt;&lt;span class="nb"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;&lt;/span&gt;&lt;span class="s"&gt;Hello from Lua&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;span class=’line’&gt;&lt;span class="nb"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;&lt;/span&gt;&lt;span class="s"&gt;Lua code is capable of reading the value set from C++&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;cppvar&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;span class=’line’&gt;&lt;span class="n"&gt;luavar&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;cppvar&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt; &lt;span class="mi"&gt;3&lt;/span&gt;
&lt;/span&gt;&lt;span class=’line’&gt;
&lt;/span&gt;&lt;span class=’line’&gt;&lt;span class="k"&gt;function&lt;/span&gt; &lt;span class="nf"&gt;myluafunction&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;times&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;span class=’line’&gt;  &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="nb"&gt;string.rep&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;&lt;/span&gt;&lt;span class="s"&gt;(-)&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;times&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;span class=’line’&gt;&lt;span class="k"&gt;end&lt;/span&gt;
&lt;/span&gt;&lt;span class=’line’&gt;
&lt;/span&gt;&lt;span class=’line’&gt;&lt;span class="k"&gt;function&lt;/span&gt; &lt;span class="nf"&gt;myfunction&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;arg&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;span class=’line’&gt;  &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="n"&gt;cppfunction&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;arg&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;span class=’line’&gt;&lt;span class="k"&gt;end&lt;/span&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&lt;/div&gt;&lt;/figure&gt;


&lt;p&gt;The code explained step by step&lt;/p&gt;

&lt;h3&gt;Initialization&lt;/h3&gt;

&lt;pre&gt;&lt;code&gt;lua_State *L;
L = luaL_newstate();
luaL_openlibs(L);
if (luaL_loadfile(L, "luascript.lua")) {
  cerr &amp;lt;&amp;lt; "Something went wrong loading the chunk (syntax error?)" &amp;lt;&amp;lt; endl;
  cerr &amp;lt;&amp;lt; lua_tostring(L, -1) &amp;lt;&amp;lt; endl;
  lua_pop(L,1);
}
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;That creates a &lt;code&gt;lua_State&lt;/code&gt; loads the standard libs in it and also loads the code in &lt;code&gt;luascript.lua&lt;/code&gt;.&lt;/p&gt;

&lt;h3&gt;Adding variables from C++ into Lua&lt;/h3&gt;

&lt;pre&gt;&lt;code&gt;lua_pushnumber(L, 1.1);
lua_setglobal(L, "cppvar");
if (lua_pcall(L,0, LUA_MULTRET, 0)) {
  cerr &amp;lt;&amp;lt; "Something went wrong during execution" &amp;lt;&amp;lt; endl;
  cerr &amp;lt;&amp;lt; lua_tostring(L, -1) &amp;lt;&amp;lt; endl;
  lua_pop(L,1);
}
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;Then it sets a global variable in Lua from C++ code using &lt;code&gt;lua_setglobal&lt;/code&gt;. If you don&amp;#8217;t know what are the &lt;code&gt;lua_pushxxxx&lt;/code&gt; and the Lua stack, etc. I recoment that you take a look at the &lt;a href="http://www.lua.org/manual/5.2/#index" title="Lua 5.2 Reference Manual"&gt;Lua Reference Manual&lt;/a&gt; and  &lt;a href="http://www.lua.org/pil" title="Programming in Lua"&gt;Programming in Lua&lt;/a&gt;. More or less Lua and the C++ communicate through the stack that lives in &lt;code&gt;lua_State&lt;/code&gt; and there is bunch of function to manipulate that stack. So in order to set a global in Lua from C++ you must push the value into the stack and call &lt;code&gt;lua_setglobal&lt;/code&gt; that will pop the value in the stack and assign it to the identifier provided inside the Lua environment.&lt;/p&gt;

&lt;p&gt;After setting the global &lt;code&gt;cppvar&lt;/code&gt; it executes the loaded chunk of code (that is in the stack) with &lt;code&gt;lua_pcall&lt;/code&gt;. The Lua code is able to read and print the value of &lt;code&gt;cppvar&lt;/code&gt;. The lua code will also set a new global &lt;code&gt;luavar&lt;/code&gt; that we will access from C++.&lt;/p&gt;

&lt;h3&gt;Reading a Lua variable from C++&lt;/h3&gt;

&lt;pre&gt;&lt;code&gt;lua_getglobal(L, "luavar");
double luavar = lua_tonumber(L,-1);
lua_pop(L,1);
cout &amp;lt;&amp;lt; "C++ can read the value set from Lua luavar = " &amp;lt;&amp;lt; luavar &amp;lt;&amp;lt; endl;
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;To get luavar from C++, we must first use &lt;code&gt;lua_getglobal&lt;/code&gt; that will put the value associated with the identifier into the top of the stack and the &lt;code&gt;lua_tonumber&lt;/code&gt; will transform whatever it&amp;#8217;s at the top of the stack into a double (well a &lt;code&gt;luaNumber&lt;/code&gt;) and then we can use that double in our C++ code to print it.&lt;/p&gt;

&lt;h3&gt;Calling a Lua function from C++&lt;/h3&gt;

&lt;pre&gt;&lt;code&gt;cout &amp;lt;&amp;lt; "** Execute a Lua function from C++" &amp;lt;&amp;lt; endl;
lua_getglobal(L, "myluafunction");
lua_pushnumber(L, 5);
lua_pcall(L, 1, 1, 0);
cout &amp;lt;&amp;lt; "The return value of the function was " &amp;lt;&amp;lt; lua_tostring(L, -1) &amp;lt;&amp;lt; endl;
lua_pop(L,1);
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;The example won&amp;#8217;t be complete without function calling so that&amp;#8217;s the next step. Calling a Lua function from C++ it&amp;#8217;s quite easy. Function in Lua are first class values, so that means that it&amp;#8217;s just a like reading a any other value. &lt;code&gt;lua_getglobal&lt;/code&gt; will get the value and put it on the stack and then we push the function arguments into the stack and use &lt;code&gt;lua_pcall&lt;/code&gt; to call the function (that is the stack). The returned value from the function will be pushed in the stack and that&amp;#8217;s were the C++ code will get it, &lt;code&gt;lua_tostring&lt;/code&gt; and then it will remove from the stack with &lt;code&gt;lua_pop&lt;/code&gt;.&lt;/p&gt;

&lt;h3&gt;Calling a C++ function from Lua&lt;/h3&gt;

&lt;pre&gt;&lt;code&gt;lua_pushcfunction(L,l_cppfunction);
lua_setglobal(L, "cppfunction");

lua_getglobal(L, "myfunction");
lua_pushnumber(L, 5);
lua_pcall(L, 1, 1, 0);
cout &amp;lt;&amp;lt; "The return value of the function was " &amp;lt;&amp;lt; lua_tonumber(L, -1) &amp;lt;&amp;lt; endl;
lua_pop(L,1);
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;The other way around it&amp;#8217;s more complex. You can&amp;#8217;t just call &lt;em&gt;any&lt;/em&gt; function from Lua. It has to has a special signature &lt;code&gt;lua_CFunction&lt;/code&gt;, that is, &lt;code&gt;typedef int (*lua_CFunction) (lua_State *L)&lt;/code&gt; a function that returns an int and takes a &lt;code&gt;lua_State&lt;/code&gt;. This special funciton will communicate with Lua via the lua stack that resides in the &lt;code&gt;lua_State&lt;/code&gt; parameter. The return value of the function tell lua how many value the function has pushed into the stack as result values for the function call.&lt;/p&gt;

&lt;p&gt;So to make the function accesible from Lua, you create push the function into the stack with &lt;code&gt;lua_pushcfunction&lt;/code&gt; and bind it to an identifier in lua with &lt;code&gt;lua_setglobal&lt;/code&gt;. Then lua code will be able to invoke this function like any other function. In the example I call the &lt;code&gt;myfunction&lt;/code&gt; (which is lua code) and &lt;code&gt;myfunction&lt;/code&gt; in turn invokes &lt;code&gt;cppfunction&lt;/code&gt; which is &amp;#8220;bound&amp;#8221; to C++ &lt;code&gt;l_cppfunction&lt;/code&gt;. Ah, I almost forgot. &lt;code&gt;l_cppfunction&lt;/code&gt; is declared as &lt;code&gt;extern "C"&lt;/code&gt; telling the compiler to provide C linkage for this function so it can be called from a C library like Lua is.&lt;/p&gt;

&lt;h3&gt;Free Lua resources&lt;/h3&gt;

&lt;pre&gt;&lt;code&gt;lua_close(L);
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;&lt;code&gt;lua_close&lt;/code&gt; will free all resources held by the &lt;code&gt;lua_State&lt;/code&gt; L.&lt;/p&gt;

&lt;h3&gt;Wrap up&lt;/h3&gt;

&lt;p&gt;I will leave the part on &lt;a href="/wp/2012/12/09/accessing-cpp-objects-from-lua/"&gt;how to wrap C++ class objects in Lua&lt;/a&gt; for a later post because I don&amp;#8217;t want to make this post too long. Hopefully I&amp;#8217;ll post it tomorrow.&lt;/p&gt;
&lt;img src="http://feeds.feedburner.com/~r/RubensBlog/~4/dLYnReT7yQA" height="1" width="1"/&gt;</content>
 <feedburner:origLink>http://rubenlaguna.com/wp/2012/11/26/first-steps-lua-cplusplus-integration/</feedburner:origLink></entry>
 
 <entry xml:base="http://rubenlaguna.com/">
   <title>Sublime Text 2 RVM and RSpec</title>
   <link href="http://feedproxy.google.com/~r/RubensBlog/~3/g6hgoKT1gYo/" />
   <updated>2012-01-30T00:00:00+01:00</updated>
   <id>http://rubenlaguna.com/wp/2012/02/01/Sublime-Text-2-with-RVM-and-Rspec</id>
   <content type="html">&lt;p&gt;&lt;b&gt;&lt;span class="caps"&gt;EDIT&lt;/span&gt;&lt;/b&gt; This post is obsolete. It has been superseeded by &lt;a href="/wp/2012/12/07/sublime-text-2-rvm-rspec-take-2/"&gt;this newer post&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;b&gt;&lt;span class="caps"&gt;OBSOLETE&lt;/span&gt;&lt;/b&gt;&lt;br /&gt;
&lt;b&gt;&lt;span class="caps"&gt;OBSOLETE&lt;/span&gt;&lt;/b&gt;&lt;br /&gt;
&lt;b&gt;&lt;span class="caps"&gt;OBSOLETE&lt;/span&gt;&lt;/b&gt;&lt;/p&gt;
&lt;p&gt;I found out about Sublime Text 2 from the &lt;a href="http://rubyrogues.com/"&gt;Ruby Rogues podcast&lt;/a&gt;, and I&amp;#8217;m loving it. Although is has been a little problematic to set it up to honor my &lt;code&gt;.rvmrc&lt;/code&gt; files and to run &lt;a href="https://www.relishapp.com/rspec"&gt;RSpec&lt;/a&gt; files from it.&lt;/p&gt;
&lt;p&gt;First to get it to honor the &lt;code&gt;.rvmrc&lt;/code&gt; project file you need to follow the instructions at &lt;a href="http://upstre.am/blog/2011/07/sublime-text-2-with-rvm-on-osx/"&gt;this post&lt;/a&gt; . To make it easier for you I copied the instructions here: you must create a &lt;code&gt;$HOME/bin/sublime_rvm.rb&lt;/code&gt; with the following content:&lt;/p&gt;
&lt;script src="https://gist.github.com/1697895.js?file=sublime_rvm.rb"&gt;&lt;/script&gt;&lt;p&gt;and make it executable with &lt;code&gt;chmod +x ~/bin/sublime_rvm.rb&lt;/code&gt; then update your &lt;code&gt;~/Library/Application\ Support/Sublime\ Text\ 2/Packages/Ruby/Ruby.sublime-build&lt;/code&gt; to look like this:&lt;/p&gt;
&lt;script src="https://gist.github.com/1697895.js?file=Ruby.sublime-build"&gt;&lt;/script&gt;&lt;p&gt;After this you should be able to run a ruby file from Sublime Text 2 using Cmd-B and it will use whatever ruby version is specified in the &lt;code&gt;.rvmrc&lt;/code&gt; for that project.&lt;/p&gt;
&lt;p&gt;Having done that I created a &lt;code&gt;~/bin/sublime_rpec.rb&lt;/code&gt; file with the following content&lt;/p&gt;
&lt;script src="https://gist.github.com/1697895.js?file=sublime_rspec.rb"&gt;&lt;/script&gt;&lt;p&gt;and then I used &lt;a href="http://wbond.net/sublime_packages/package_control"&gt;Package Control&lt;/a&gt; to install &lt;a href="https://github.com/maltize/sublime-text-2-ruby-tests"&gt;RubyTest&lt;/a&gt; and modified &lt;code&gt;~/Library/Application\ Support/Sublime\ Text\ 2/Packages/RubyTest/RubyTest.sublime-settings&lt;/code&gt; like this:&lt;/p&gt;
&lt;script src="https://gist.github.com/1697895.js?file=RubyTest.sublime-settings"&gt;&lt;/script&gt;&lt;p&gt;Of course you should point to your &lt;code&gt;sublime_rspec.rb&lt;/code&gt; path which will differ from mine. And now when I press Cmd-Shift-R, Sublime Text will run the file with RSpec. Well in my case I prefer to run the RSpec test with the the &lt;a href="http://gembundler.com/"&gt;bundled&lt;/a&gt; version of RSpec for the project, that&amp;#8217;s why I use &lt;code&gt;bundle exec rspec #{file}&lt;/code&gt; in the script. If you want to use the RSpec gem installed in your rvm gemset remove the &lt;code&gt;bundle exec&lt;/code&gt; part.&lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/RubensBlog/~4/g6hgoKT1gYo" height="1" width="1"/&gt;</content>
 <feedburner:origLink>http://rubenlaguna.com/wp/2012/02/01/sublime-text-2-rvm-rspec/</feedburner:origLink></entry>
 
 <entry xml:base="http://rubenlaguna.com/">
   <title>Running a custom TestRunner from rake</title>
   <link href="http://feedproxy.google.com/~r/RubensBlog/~3/FbjVs6QQJcI/running-custom-testrunner-rake" />
   <updated>2011-08-17T00:00:00+02:00</updated>
   <id>http://rubenlaguna.com/wp/2011/08/17/custom-testrunner-from-rake</id>
   <content type="html">&lt;p&gt;I was surprised when I searched in Google for ways of running a custom TestRunner in a &lt;code&gt;Rake::TestTask&lt;/code&gt; and I couldn&amp;#8217;t find anything directly.&lt;/p&gt;
&lt;p&gt;So after figuring out myself how it&amp;#8217;s done I decided to share it here:&lt;/p&gt;
&lt;p&gt;Let&amp;#8217;s say that you have the following TestRunner (&lt;a href="http://endofline.wordpress.com/2008/02/11/a-custom-testrunner-to-scratch-an-itch/"&gt;learn how to write your custom TestRunner&lt;/a&gt;)&lt;/p&gt;
&lt;p&gt;&lt;div class=’bogus-wrapper’&gt;&lt;notextile&gt;&lt;figure class=’code’&gt;&lt;div class="highlight"&gt;&lt;table&gt;&lt;tr&gt;&lt;td class="gutter"&gt;&lt;pre class="line-numbers"&gt;&lt;span class=’line-number’&gt;1&lt;/span&gt;
&lt;span class=’line-number’&gt;2&lt;/span&gt;
&lt;span class=’line-number’&gt;3&lt;/span&gt;
&lt;span class=’line-number’&gt;4&lt;/span&gt;
&lt;span class=’line-number’&gt;5&lt;/span&gt;
&lt;span class=’line-number’&gt;6&lt;/span&gt;
&lt;span class=’line-number’&gt;7&lt;/span&gt;
&lt;span class=’line-number’&gt;8&lt;/span&gt;
&lt;span class=’line-number’&gt;9&lt;/span&gt;
&lt;span class=’line-number’&gt;10&lt;/span&gt;
&lt;span class=’line-number’&gt;11&lt;/span&gt;
&lt;span class=’line-number’&gt;12&lt;/span&gt;
&lt;span class=’line-number’&gt;13&lt;/span&gt;
&lt;span class=’line-number’&gt;14&lt;/span&gt;
&lt;span class=’line-number’&gt;15&lt;/span&gt;
&lt;span class=’line-number’&gt;16&lt;/span&gt;
&lt;span class=’line-number’&gt;17&lt;/span&gt;
&lt;span class=’line-number’&gt;18&lt;/span&gt;
&lt;/pre&gt;&lt;/td&gt;&lt;td class=’code’&gt;&lt;pre&gt;&lt;code class=”&gt;&lt;span class=’line’&gt;# Usage:
&lt;/span&gt;&lt;span class=’line’&gt;#   ruby -rstat_runner [test] –runner=stat
&lt;/span&gt;&lt;span class=’line’&gt;# http://endofline.wordpress.com/2008/02/11/a-custom-testrunner-to-scratch-an-itch/require ‘test/unit’
&lt;/span&gt;&lt;span class=’line’&gt;require ‘test/unit/ui/console/testrunner’
&lt;/span&gt;&lt;span class=’line’&gt;class StatRunner &amp;lt; Test::Unit::UI::Console::TestRunner
&lt;/span&gt;&lt;span class=’line’&gt;  def finished(elapsed_time)
&lt;/span&gt;&lt;span class=’line’&gt;    nl
&lt;/span&gt;&lt;span class=’line’&gt;    output("="*72)
&lt;/span&gt;&lt;span class=’line’&gt;    output("|"+"Finished in #{elapsed_time} seconds.".center(70)+"|")
&lt;/span&gt;&lt;span class=’line’&gt;    output("="*72)
&lt;/span&gt;&lt;span class=’line’&gt;    nl
&lt;/span&gt;&lt;span class=’line’&gt;    output(@result)
&lt;/span&gt;&lt;span class=’line’&gt;  end
&lt;/span&gt;&lt;span class=’line’&gt;end
&lt;/span&gt;&lt;span class=’line’&gt;
&lt;/span&gt;&lt;span class=’line’&gt;Test::Unit::AutoRunner::RUNNERS[:stat] = proc do |r|
&lt;/span&gt;&lt;span class=’line’&gt;  StatRunner
&lt;/span&gt;&lt;span class=’line’&gt;end&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&lt;/div&gt;&lt;/figure&gt;&lt;/div&gt;&lt;/notextile&gt;&lt;/p&gt;
&lt;p&gt;This new &lt;code&gt;StatRunner&lt;/code&gt; is very simple and the only customization is that it prints the result line wrapped in a box.&lt;/p&gt;
&lt;p&gt;Now imagine that this &lt;code&gt;StatRunner&lt;/code&gt; is defined in the &lt;code&gt;test/stat_runner.rb&lt;/code&gt; file. The rake task in the rakefile would look like:&lt;/p&gt;
&lt;p&gt;&lt;div class=’bogus-wrapper’&gt;&lt;notextile&gt;&lt;figure class=’code’&gt;&lt;div class="highlight"&gt;&lt;table&gt;&lt;tr&gt;&lt;td class="gutter"&gt;&lt;pre class="line-numbers"&gt;&lt;span class=’line-number’&gt;1&lt;/span&gt;
&lt;span class=’line-number’&gt;2&lt;/span&gt;
&lt;span class=’line-number’&gt;3&lt;/span&gt;
&lt;span class=’line-number’&gt;4&lt;/span&gt;
&lt;span class=’line-number’&gt;5&lt;/span&gt;
&lt;span class=’line-number’&gt;6&lt;/span&gt;
&lt;span class=’line-number’&gt;7&lt;/span&gt;
&lt;span class=’line-number’&gt;8&lt;/span&gt;
&lt;span class=’line-number’&gt;9&lt;/span&gt;
&lt;/pre&gt;&lt;/td&gt;&lt;td class=’code’&gt;&lt;pre&gt;&lt;code class=”&gt;&lt;span class=’line’&gt;# http://rake.rubyforge.org/classes/Rake/TestTask.html
&lt;/span&gt;&lt;span class=’line’&gt;require ‘rake/testtask’
&lt;/span&gt;&lt;span class=’line’&gt;Rake::TestTask.new(:test) do |test|
&lt;/span&gt;&lt;span class=’line’&gt;  test.libs &amp;lt;&amp;lt; ‘lib’ &amp;lt;&amp;lt; ‘test’  # test dir is in, so we can do -rstat_runner
&lt;/span&gt;&lt;span class=’line’&gt;  test.ruby_opts=[‘-rstat_runner’] # require stat_runner.rb in spawned ruby process  
&lt;/span&gt;&lt;span class=’line’&gt;  test.pattern = ‘test/**/test_*.rb’
&lt;/span&gt;&lt;span class=’line’&gt;  test.verbose = true
&lt;/span&gt;&lt;span class=’line’&gt;  test.options="–runner=stat" #force to use the new runner called stat (has to be in RUNNERS)
&lt;/span&gt;&lt;span class=’line’&gt;end&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&lt;/div&gt;&lt;/figure&gt;&lt;/div&gt;&lt;/notextile&gt;&lt;/p&gt;
&lt;p&gt;That&amp;#8217;s it. Now if you run your rakefile you&amp;#8217;ll get&lt;/p&gt;
&lt;pre&gt;
  Started

  ========================================================================
  |                    Finished in 0.000103 seconds.                     |
  ========================================================================

  1 tests, 1 assertions, 0 failures, 0 errors
&lt;/pre&gt;&lt;img src="http://feeds.feedburner.com/~r/RubensBlog/~4/FbjVs6QQJcI" height="1" width="1"/&gt;</content>
 <feedburner:origLink>http://rubenlaguna.com/wp/2011/08/17/running-custom-testrunner-rake</feedburner:origLink></entry>
 
 <entry xml:base="http://rubenlaguna.com/">
   <title>Compiling OpenChronos in Windows</title>
   <link href="http://feedproxy.google.com/~r/RubensBlog/~3/H-EZx_fBusI/compiling-openchronos-in-windows" />
   <updated>2011-02-11T00:00:00+01:00</updated>
   <id>http://rubenlaguna.com/wp/2011/02/11/Compiling-OpenChronos-in-Windows</id>
   <content type="html">&lt;p&gt;I got the &lt;a href="http://processors.wiki.ti.com/index.php/EZ430-Chronos"&gt;EZ430 Chronos&lt;/a&gt; some days ago and after play around a little with the &lt;a href="http://processors.wiki.ti.com/index.php/Download_CCS"&gt;Code Composer Studio v4&lt;/a&gt; that comes with it (the free code size limited version) I got the TI firmware compiled and uploaded to the watch. Then I realized that what I compiled it was a stripped down version of the firmware called &lt;strong&gt;Limited&lt;/strong&gt; as the code-size-limited CCSv4 cannot be used to compiled the &lt;strong&gt;Unrestricted&lt;/strong&gt; firmware.&lt;/p&gt;
&lt;p&gt;So now to get a decent firmware in the EZ430 I need either the full CCSv4 or another toolchain for the &lt;a href="http://focus.ti.com/mcu/docs/mcumspoverview.tsp?sectionId=95&amp;amp;tabId=140&amp;amp;familyId=342&amp;amp;DCMP=MCU_other&amp;amp;HQS=Other+IL+msp430"&gt;MSP430 MCUs&lt;/a&gt; with specific support for &lt;a href="http://focus.ti.com/docs/prod/folders/print/cc430f6137.html"&gt;CC430F6137&lt;/a&gt; which is the processor present in the &lt;em&gt;eZ430-Chronos&lt;/em&gt; . CCSv4 is quite expensive: &lt;strong&gt;~500USD&lt;/strong&gt; so I started looking for other toolchains.&lt;/p&gt;
&lt;p&gt;I tried &lt;a href="http://mspgcc.sourceforge.net/"&gt;mspgcc&lt;/a&gt; but it didn&amp;#8217;t really work for me. I was getting compilation errors, and I didn&amp;#8217;t feel like investigating those. Then I turn into &lt;a href="https://github.com/poelzi/OpenChronos"&gt;OpenChronos&lt;/a&gt; which seems to be the TI firmware but just modified enough to be able to compile using the &lt;a href="http://mspgcc4.sourceforge.net/"&gt;mspgcc4&lt;/a&gt; toolchain so I started exploring that path.&lt;/p&gt;
&lt;p&gt;I couldn&amp;#8217;t get the Win32 port of &lt;em&gt;mspgcc4&lt;/em&gt; to work properly (seems to me that the Win32 has been updated in a while). So at the end I had to use it from &lt;a href="http://www.cygwin.com"&gt;Cygwin&lt;/a&gt; . These are the steps that I took:&lt;/p&gt;
&lt;ol&gt;
	&lt;li&gt;Install &lt;em&gt;wget&lt;/em&gt;, &lt;em&gt;patch&lt;/em&gt;, &lt;em&gt;gcc 4&lt;/em&gt; , &lt;em&gt;make&lt;/em&gt;, &lt;em&gt;python&lt;/em&gt; and &lt;em&gt;perl&lt;/em&gt; in Cygwin&lt;br /&gt;
&lt;img src="/wp/wp-content/uploads/2011/02/cygwinsetupgcc.png" alt="" /&gt;&lt;/li&gt;
	&lt;li&gt;Download the &lt;a href="http://sourceforge.net/projects/mspgcc4/files/mspgcc4/mspgcc4-20110130.tar.bz2/download"&gt;source distribution of mspgcc4&lt;/a&gt;&lt;/li&gt;
	&lt;li&gt;Unpack it inside a Cygwin bash shell &lt;br /&gt;
&lt;div class=’bogus-wrapper’&gt;&lt;notextile&gt;&lt;figure class=’code’&gt;&lt;div class="highlight"&gt;&lt;table&gt;&lt;tr&gt;&lt;td class="gutter"&gt;&lt;pre class="line-numbers"&gt;&lt;span class=’line-number’&gt;1&lt;/span&gt;
&lt;span class=’line-number’&gt;2&lt;/span&gt;
&lt;/pre&gt;&lt;/td&gt;&lt;td class=’code’&gt;&lt;pre&gt;&lt;code class=”&gt;&lt;span class=’line’&gt;cd tmp
&lt;/span&gt;&lt;span class=’line’&gt;tar xvjf /cygdrive/c/Users/xxxx/Downloads/mspgcc4-20110130.tar.bz2&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&lt;/div&gt;&lt;/figure&gt;&lt;/div&gt;&lt;/notextile&gt;&lt;br /&gt;
&lt;img src="/wp/wp-content/uploads/2011/02/unpack.png" alt="" /&gt;&lt;/li&gt;
	&lt;li&gt;Build mspgcc&lt;br /&gt;
&lt;div class=’bogus-wrapper’&gt;&lt;notextile&gt;&lt;figure class=’code’&gt;&lt;div class="highlight"&gt;&lt;table&gt;&lt;tr&gt;&lt;td class="gutter"&gt;&lt;pre class="line-numbers"&gt;&lt;span class=’line-number’&gt;1&lt;/span&gt;
&lt;span class=’line-number’&gt;2&lt;/span&gt;
&lt;/pre&gt;&lt;/td&gt;&lt;td class=’code’&gt;&lt;pre&gt;&lt;code class=”&gt;&lt;span class=’line’&gt;cd mspgcc4-20110130
&lt;/span&gt;&lt;span class=’line’&gt;./buildgcc.pl&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&lt;/div&gt;&lt;/figure&gt;&lt;/div&gt;&lt;/notextile&gt;&lt;br /&gt;
Select gcc-4.4.5, &lt;strong&gt;no&lt;/strong&gt; gdb, &lt;strong&gt;no&lt;/strong&gt; insight, ti_20110130, and the rest of the defaults.&lt;/li&gt;
	&lt;li&gt;After a long compile &lt;em&gt;mspgcc4&lt;/em&gt;  should be installed in /opt/msp430-gcc-4.4.5/&lt;/li&gt;
	&lt;li&gt;Add &lt;code&gt;export PATH=$PATH:/opt/msp430-gcc-4.4.5/bin&lt;/code&gt; to &lt;code&gt;~/.bashrc&lt;/code&gt;&lt;/li&gt;
	&lt;li&gt;Download OpenChronos&lt;br /&gt;
&lt;div class=’bogus-wrapper’&gt;&lt;notextile&gt;&lt;figure class=’code’&gt;&lt;div class="highlight"&gt;&lt;table&gt;&lt;tr&gt;&lt;td class="gutter"&gt;&lt;pre class="line-numbers"&gt;&lt;span class=’line-number’&gt;1&lt;/span&gt;
&lt;span class=’line-number’&gt;2&lt;/span&gt;
&lt;span class=’line-number’&gt;3&lt;/span&gt;
&lt;span class=’line-number’&gt;4&lt;/span&gt;
&lt;span class=’line-number’&gt;5&lt;/span&gt;
&lt;span class=’line-number’&gt;6&lt;/span&gt;
&lt;span class=’line-number’&gt;7&lt;/span&gt;
&lt;span class=’line-number’&gt;8&lt;/span&gt;
&lt;/pre&gt;&lt;/td&gt;&lt;td class=’code’&gt;&lt;pre&gt;&lt;code class=”&gt;&lt;span class=’line’&gt;cd ~
&lt;/span&gt;&lt;span class=’line’&gt; git clone git://github.com/poelzi/OpenChronos.git
&lt;/span&gt;&lt;span class=’line’&gt; Cloning into OpenChronos…
&lt;/span&gt;&lt;span class=’line’&gt; remote: Counting objects: 1485, done.
&lt;/span&gt;&lt;span class=’line’&gt; remote: Compressing objects: 100% (550/550), done.
&lt;/span&gt;&lt;span class=’line’&gt; remote: Total 1485 (delta 972), reused 1364 (delta 877)Receiving objects  93%
&lt;/span&gt;&lt;span class=’line’&gt; Receiving objects: 100% (1485/1485), 666.11 KiB | 411 KiB/s, done.
&lt;/span&gt;&lt;span class=’line’&gt; Resolving deltas: 100% (972/972), done.&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&lt;/div&gt;&lt;/figure&gt;&lt;/div&gt;&lt;/notextile&gt;&lt;/li&gt;
	&lt;li&gt;Configure the build&lt;br /&gt;
&lt;code&gt;cd OpenChronos&lt;/code&gt;&lt;br /&gt;
&lt;code&gt;make config&lt;/code&gt;&lt;/li&gt;
	&lt;li&gt;Select the proper frequency (868Mhz if you are in Europe) and save&lt;br /&gt;
&lt;img src="/wp/wp-content/uploads/2011/02/makeconfig.png" alt="" /&gt;&lt;/li&gt;
	&lt;li&gt;Run make &lt;br /&gt;
&lt;div class=’bogus-wrapper’&gt;&lt;notextile&gt;&lt;figure class=’code’&gt;&lt;div class="highlight"&gt;&lt;table&gt;&lt;tr&gt;&lt;td class="gutter"&gt;&lt;pre class="line-numbers"&gt;&lt;span class=’line-number’&gt;1&lt;/span&gt;
&lt;span class=’line-number’&gt;2&lt;/span&gt;
&lt;span class=’line-number’&gt;3&lt;/span&gt;
&lt;span class=’line-number’&gt;4&lt;/span&gt;
&lt;span class=’line-number’&gt;5&lt;/span&gt;
&lt;span class=’line-number’&gt;6&lt;/span&gt;
&lt;span class=’line-number’&gt;7&lt;/span&gt;
&lt;span class=’line-number’&gt;8&lt;/span&gt;
&lt;span class=’line-number’&gt;9&lt;/span&gt;
&lt;span class=’line-number’&gt;10&lt;/span&gt;
&lt;span class=’line-number’&gt;11&lt;/span&gt;
&lt;span class=’line-number’&gt;12&lt;/span&gt;
&lt;span class=’line-number’&gt;13&lt;/span&gt;
&lt;span class=’line-number’&gt;14&lt;/span&gt;
&lt;span class=’line-number’&gt;15&lt;/span&gt;
&lt;/pre&gt;&lt;/td&gt;&lt;td class=’code’&gt;&lt;pre&gt;&lt;code class=”&gt;&lt;span class=’line’&gt;make
&lt;/span&gt;&lt;span class=’line’&gt;  Assembling even_in_range in one step for MSP430…
&lt;/span&gt;&lt;span class=’line’&gt;  msp430-gcc -D_GNU_ASSEMBLER_ -x assembler-with-cpp -c even_in_range.s -o even_in_range.o
&lt;/span&gt;&lt;span class=’line’&gt;  Compiling main for MSP430…
&lt;/span&gt;&lt;span class=’line’&gt;  msp430-gcc -mmcu=cc430x6137 -Os -Wall -fomit-frame-pointer -fno-force-addr -finline-limit=1 -fno-schedule-insns  -Wl,-Map=output.map -o build/eZChronos.elf logi
&lt;/span&gt;&lt;span class=’line’&gt;  … 
&lt;/span&gt;&lt;span class=’line’&gt;  …
&lt;/span&gt;&lt;span class=’line’&gt;  … 
&lt;/span&gt;&lt;span class=’line’&gt;  ronos.o gcc/intrinsics.o  even_in_range.o
&lt;/span&gt;&lt;span class=’line’&gt;  Convert to TI Hex file
&lt;/span&gt;&lt;span class=’line’&gt;  python tools/memory.py -i build/eZChronos.elf -o build/eZChronos.txt
&lt;/span&gt;&lt;span class=’line’&gt;  ELF section .text at 0x8000 32224 bytes
&lt;/span&gt;&lt;span class=’line’&gt;  ELF section .data at 0xfde0 150 bytes
&lt;/span&gt;&lt;span class=’line’&gt;  ELF section .vectors at 0xff80 128 bytes
&lt;/span&gt;&lt;span class=’line’&gt;  convert to TI Hex&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&lt;/div&gt;&lt;/figure&gt;&lt;/div&gt;&lt;/notextile&gt;&lt;/li&gt;
	&lt;li&gt;Upload the new compiled firmware &lt;code&gt;build/eZChronos.txt&lt;/code&gt; using the &lt;strong&gt;Wireless update&lt;/strong&gt; feature of &lt;em&gt;Chronos Control Center&lt;/em&gt; (you have to have the &lt;span class="caps"&gt;USB&lt;/span&gt; access point connected, of course)
	&lt;ol&gt;
		&lt;li&gt;Select the firmware file &lt;code&gt;c:/cygwin/home/xxxxxx/OpenCronos/build/eZChronos.txt&lt;/code&gt;&lt;/li&gt;
		&lt;li&gt;Click on  &lt;strong&gt;Update Chronos Watch&lt;/strong&gt; button&lt;/li&gt;
		&lt;li&gt;In the watch, navigate to &lt;strong&gt;rFbSL&lt;/strong&gt; (using the &lt;code&gt;#&lt;/code&gt; button) and start it (by holding &lt;code&gt;#&lt;/code&gt;). If everything goes at it should the download will start and you will see the percentage of firmware tranferred so far in the watch screen (also in &lt;em&gt;Chronos Control Center&lt;/em&gt;). &lt;br /&gt;
&lt;img src="/wp/wp-content/uploads/2011/02/wupdate.png" alt="" /&gt;&lt;/li&gt;
	&lt;/ol&gt;&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;If you think that there is something missing or not clear, leave a comment.&lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/RubensBlog/~4/H-EZx_fBusI" height="1" width="1"/&gt;</content>
 <feedburner:origLink>http://rubenlaguna.com/wp/2011/02/11/compiling-openchronos-in-windows</feedburner:origLink></entry>
 
 <entry xml:base="http://rubenlaguna.com/">
   <title>Training A Specific Opening With Rybka Aquarium</title>
   <link href="http://feedproxy.google.com/~r/RubensBlog/~3/a-zJRDs_yYg/training-specific-opening-with-rybka-aquarium" />
   <updated>2010-09-19T00:00:00+02:00</updated>
   <id>http://rubenlaguna.com/wp/2010/09/19/Training-a-specific-opening-with-Rybka-Aquarium</id>
   <content type="html">&lt;p&gt;I recently bought the &lt;a href="http://chessok.com/shop/index.php?main_page=product_info&amp;amp;cPath=7_1&amp;amp;products_id=374"&gt;Rybka 4 Aquarium + Chess Assistant 11 combo&lt;/a&gt; from ChessOK and I was trying to figure out how to practice openings with it.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;&lt;span class="caps"&gt;DISCLAIMER&lt;/span&gt;&lt;/strong&gt;: If you know of any other better way to do this or you think something is not clear, please leave a comment!&lt;/p&gt;
&lt;p&gt;In &lt;em&gt;Chapter 11:Trees&lt;/em&gt; of the &lt;a href="http://chessok.com/doc/aquarium/Aquarium4.pdf"&gt;Aquarium manual&lt;/a&gt; they mention how &amp;#8220;discarded moves&amp;#8221; trees can be used for making Aquarium play certain openings over others:&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;[&amp;#8230;] After you have created an opening book you can use the discarded moves tree to create a &amp;#8220;mask&amp;#8221; for it to play or not play certain moves or openings. You can have one opening book and as many &amp;#8220;discarded moves&amp;#8221; trees as you like. This means that if you store your whole opening repertoire in a single opening book you can, for instance, define the following &amp;#8220;discarded moves&amp;#8221; trees: &lt;br /&gt;
1) One that only plays the gambit openings in your opening book&lt;br /&gt;
2) One that never plays the Sicilian&lt;br /&gt;
3) One that only plays queen pawn openings as white.&lt;br /&gt;
4) One that whenever possible plays the Sicilian Dragon as black.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;But it doesn&amp;#8217;t exactly explain how (Shame on them! :). So I tried to figure out myself how to do it with the help of the &lt;a href="http://rybkaforum.net/cgi-bin/rybkaforum/topic_show.pl?tid=18855"&gt;rybkaforums.net&lt;/a&gt; (Thanks to Felix Kling, ppipper and buffos). After reading several times the &lt;a href="http://chessok.com/doc/aquarium/Aquarium4.pdf"&gt;manual&lt;/a&gt;, &lt;a href="http://www.chesscafe.com/text/chessok24.pdf"&gt;this&lt;/a&gt; , &lt;a href="http://www.chesscafe.com/text/chessok25.pdf"&gt;this&lt;/a&gt; and &lt;a href="http://rybkaforum.net/cgi-bin/rybkaforum/topic_show.pl?pid=154163#pid154163"&gt;this&lt;/a&gt; I think I understand how to do it. Let me explain it.&lt;/p&gt;
&lt;p&gt;First, some background&amp;#8230;&lt;/p&gt;
&lt;h2&gt;Tree configurations&lt;/h2&gt;
&lt;p&gt;To understand better &lt;em&gt;tree configurations&lt;/em&gt;_ read the &lt;a href="http://www.chesscafe.com/text/chessok24.pdf"&gt;ChessCafe: Introduction to Tree Configurations&lt;/a&gt; and &lt;a href="http://rybkaforum.net/cgi-bin/rybkaforum/topic_show.pl?pid=154163#pid154163"&gt;buffos i-book about tree configurations&lt;/a&gt;. I will try to describe tree configuration briefly here but it&amp;#8217;s worth reading those two documents.&lt;/p&gt;
&lt;p&gt;&lt;img src="/wp/wp-content/uploads/2010/09/treeconf.png" alt="" /&gt;&lt;/p&gt;
&lt;p&gt;A tree configuration is a set of &amp;#8220;regular&amp;#8221; trees containing precomputed informations about the board positions plus a &lt;em&gt;maintree&lt;/em&gt; and &lt;em&gt;discarded&lt;/em&gt; tree. The &amp;#8220;regular&amp;#8221; trees are positional trees, graphs where the nodes are board positions and edges are the moves that connect one position to another. Attached to each board position there is some information, for example an engine evaluation for the position, success ratio statistics, textual annotations, etc. A tree configuration &amp;#8220;merges&amp;#8221; at runtime those trees and computes some other attributes (columns) derived from the info in those trees. These trees are considered &lt;em&gt;read-only&lt;/em&gt; from Aquarium point of view.&lt;/p&gt;
&lt;p&gt;Then there are two special &amp;#8220;trees&amp;#8221; in each tree configuration. The &lt;em&gt;maintree&lt;/em&gt; and the &lt;em&gt;discarded&lt;/em&gt; tree. These trees you can modify from the Aquarium &lt;span class="caps"&gt;GUI&lt;/span&gt;. When you mark a move as good/interesting/bad etc in the tree that information is stored in the maintree. If you mark a move as discarded or set the playing probability of a move by hand that information will be stored in the discarded tree.&lt;/p&gt;
&lt;p&gt;So by creating different tree configurations with different maintrees and discarded trees you can use as opening books you can make rybka to play different opening moves. We&amp;#8217;ll see how to do it right now&amp;#8230;&lt;/p&gt;
&lt;h2&gt;Examples: One that only plays the gambit openings in your opening book&lt;/h2&gt;
&lt;p&gt;Let&amp;#8217;s begin by going to the tree configurations dialog (&lt;strong&gt;Sandbox&lt;/strong&gt; mode &amp;rArr; Tree &amp;rArr; Options) and create a new tree configuration (see &lt;a href=":http://www.chesscafe.com/text/chessok25.pdf"&gt;chesscafe article&lt;/a&gt; for details) from the &lt;em&gt;NarrowBook&lt;/em&gt; tree configuration.&lt;/p&gt;
&lt;p&gt;&lt;img src="/wp/wp-content/uploads/2010/09/copyconf.png" alt="" /&gt;&lt;/p&gt;
&lt;p&gt;and name it &amp;#8220;gambits&amp;#8221; for example. Then change the &amp;#8220;Main tree path&amp;#8221; to gambits_maintree and &amp;#8220;Discarded tree path&amp;#8221; to gambits_discarded. This will create an empty maintree and empty discarded tree, new trees that are not shared by any other tree configuration, this is important because you don&amp;#8217;t want the changes in gambit tree configuration affect any other tree configuration.&lt;/p&gt;
&lt;p&gt;Now we can proceed to set the Play% (playing probability) of the moves from the Aquarium &lt;span class="caps"&gt;GUI&lt;/span&gt;.&lt;/p&gt;
&lt;p&gt;You can influence the Play% of the moves in two ways (that I know of):&lt;/p&gt;
&lt;p&gt;&lt;img src="/wp/wp-content/uploads/2010/09/menu.png" alt="" /&gt;&lt;/p&gt;
&lt;p&gt;First you can just set the playing probability by clicking on &amp;#8220;Enter percents&amp;#8230;&amp;#8221; (or using the faster keyboard shortcut &amp;#8220;+&amp;#8221;). &lt;strong&gt;This is what I recommend&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;&lt;img src="/wp/wp-content/uploads/2010/09/setplayingprob.png" alt="" /&gt;&lt;/p&gt;
&lt;p&gt;Or you can mark the move as good/interesting/dubious/bad/discarded. If you mark it as good you will prioritize the move, if you mark it as bad or discarded it won&amp;#8217;t be played. For details about how the prioritizations actually works take a look at the following &lt;a href="http://rybkaforum.net/cgi-bin/rybkaforum/topic_show.pl?pid=154163#pid154163"&gt;i-book&lt;/a&gt; (pay special attention to the Bonus system chapter).&lt;/p&gt;
&lt;p&gt;Obviously the first gives you fine tuned control over the playing probability and that&amp;#8217;s the method that I&amp;#8217;ll be using here.&lt;/p&gt;
&lt;p&gt;So let&amp;#8217;s make this tree configuration to play only &lt;code&gt;1.e4&lt;/code&gt; or &lt;code&gt;1.d4&lt;/code&gt; when playing as white by using &amp;#8220;+&amp;#8221; key to set both to 50%.&lt;/p&gt;
&lt;p&gt;&lt;img src="/wp/wp-content/uploads/2010/09/whiteprob.png" alt="" /&gt;&lt;/p&gt;
&lt;p&gt;So far, so good. By using this opening book &amp;#8220;gambits&amp;#8221; rybka will always play e4 or d4 as first move. Now we are going to force to always play the &lt;a href="http://en.wikipedia.org/wiki/King&amp;#39;s_Gambit"&gt;King&amp;#8217;s gambit&lt;/a&gt; if black plays &lt;code&gt;1…e5&lt;/code&gt;.&lt;/p&gt;
&lt;p&gt;On the tree select &lt;code&gt;1.e4&lt;/code&gt; and press right arrow (&amp;rarr;). Then it will present the black alternatives to &lt;code&gt;1.e4&lt;/code&gt; among those &lt;code&gt;1…e6&lt;/code&gt; , &lt;code&gt;1…e5&lt;/code&gt;, etc. Locate and select &lt;code&gt;1…e5&lt;/code&gt; (using the up &amp;uarr; and down &amp;darr; arrows to navigate between options) and right arrow &amp;rarr; to go into move &lt;code&gt;1…e5&lt;/code&gt;, we don&amp;#8217;t need to set the play probability for &lt;code&gt;1…e5&lt;/code&gt; because we are not interested on rybka playing &lt;code&gt;1…e5&lt;/code&gt; (we want to practice these openings with the human player playing black). Then go down until you see &lt;code&gt;2.f4&lt;/code&gt; and press + to set 100% play probability. Using the keyboard to modify the tree is way faster than using the mouse so learn the keyboar shortcuts.&lt;/p&gt;
&lt;p&gt;&lt;img src="/wp/wp-content/uploads/2010/09/f4.png" alt="" /&gt;&lt;/p&gt;
&lt;p&gt;Let&amp;#8217;s also program this opening book to play the &lt;a href="http://en.wikipedia.org/wiki/Queen&amp;#39;s_Gambit"&gt;Queen&amp;#8217;s gambit&lt;/a&gt; whenever is possible.&lt;/p&gt;
&lt;p&gt;Navigate in the tree window from &lt;code&gt;1.d4&lt;/code&gt; &amp;rarr; &lt;code&gt;1…d5&lt;/code&gt; &amp;rarr; and select &lt;code&gt;2.c4&lt;/code&gt; and set playing probability to 100% with the &amp;#8220;+&amp;#8221; key.&lt;/p&gt;
&lt;p&gt;&lt;img src="/wp/wp-content/uploads/2010/09/c4.png" alt="" /&gt;&lt;/p&gt;
&lt;p&gt;Now you can go to &lt;strong&gt;Play mode&lt;/strong&gt; and let Rybka play the white (make sure you select &amp;#8220;gambits&amp;#8221; opening book) and you will see that white always plays the King&amp;#8217;s gambit or the Queen&amp;#8217;s gambit.&lt;/p&gt;
&lt;p&gt;&lt;img src="/wp/wp-content/uploads/2010/09/selectbook.png" alt="" /&gt;&lt;/p&gt;
&lt;h2&gt;Example: One that whenever possible plays the Sicilian Dragon as black&lt;/h2&gt;
&lt;p&gt;Now let&amp;#8217;s create a new tree configuration that plays &lt;em&gt;Sicilian Dragon&lt;/em&gt; whenever is possible. This time we will use the &lt;a href="http://chessok.com/shop/index.php?main_page=product_info&amp;amp;cPath=7_1&amp;amp;products_id=352"&gt;Rybka Opening book&lt;/a&gt; as base and keep the good move/bad move coloring did &lt;a href="http://www.chesscafe.com/text/chessok44.pdf"&gt;by&lt;/a&gt;  &lt;a href="http://www.chessbase.com/newsdetail.asp?newsid=6428"&gt;Jiri&lt;/a&gt; &lt;a href="http://www.chessbase.com/newsdetail.asp?newsid=6459"&gt;Dufek&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;Ok, first go to &lt;strong&gt;Sandbox&lt;/strong&gt; mode &amp;rArr; Tree &amp;rArr; Options and select Rybka4_book from the list of configurations. Click on New &amp;rArr; Copy current configuration (Rybka4_book) &amp;rArr; Next and name it &amp;#8220;sicilian_dragon_black&amp;#8221;.&lt;/p&gt;
&lt;p&gt;Leave the &lt;em&gt;Main tree path&lt;/em&gt; as &amp;#8220;Rybka4book\rybka4_Jiri_Dufek&amp;#8221; and replace &lt;em&gt;Discarded tree path&lt;/em&gt; with &amp;#8220;discarded_sicilian_dragon_black&amp;#8221;. You will end up with the following:&lt;/p&gt;
&lt;p&gt;&lt;img src="/wp/wp-content/uploads/2010/09/sbd.png" alt="" /&gt;&lt;/p&gt;
&lt;p&gt;So now let&amp;#8217;s force Rybka to play &lt;a href="http://en.wikipedia.org/wiki/Sicilian_Defence,_Dragon_Variation"&gt;Sicilian Dragon&lt;/a&gt; . Select 1.e4 and right arrow &amp;rarr;, select &lt;code&gt;1…c5&lt;/code&gt; press &amp;#8220;+&amp;#8221; and set 100%. Press right arrow &amp;rarr; to go the next move (white), select &lt;code&gt;2.Nf3&lt;/code&gt; right arrow &amp;rarr; and select &lt;code&gt;2…d6&lt;/code&gt; and set it to 100%, do the same for &lt;code&gt;3…cxd4&lt;/code&gt;, &lt;code&gt;4…Nf6&lt;/code&gt; and &lt;code&gt;5…g6&lt;/code&gt;. And that&amp;#8217;s it:&lt;/p&gt;
&lt;p&gt;&lt;img src="/wp/wp-content/uploads/2010/09/sbd2.png" alt="" /&gt;&lt;/p&gt;
&lt;h2&gt;Links&lt;/h2&gt;
&lt;ul&gt;
	&lt;li&gt;&lt;a href="http://chessok.com/doc/aquarium/Aquarium4.pdf"&gt;Aquarium manual&lt;/a&gt;&lt;/li&gt;
	&lt;li&gt;&lt;a href="http://www.chesscafe.com/text/chessok24.pdf"&gt;ChessCafe: Introduction to Tree Configurations&lt;/a&gt;&lt;/li&gt;
	&lt;li&gt;&lt;a href="http://www.chesscafe.com/text/chessok25.pdf"&gt;ChessCafe: Creating Tree Configurations&lt;/a&gt;&lt;/li&gt;
	&lt;li&gt;&lt;a href="http://rybkaforum.net/cgi-bin/rybkaforum/topic_show.pl?pid=154163#pid154163"&gt;buffos i-book about tree configurations&lt;/a&gt;&lt;/li&gt;
	&lt;li&gt;&lt;a href="http://rybkaforum.net/cgi-bin/rybkaforum/topic_show.pl?tid=18855"&gt;Force a given opening in Rybka Aquarium 2010 with trees&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;&lt;img src="http://feeds.feedburner.com/~r/RubensBlog/~4/a-zJRDs_yYg" height="1" width="1"/&gt;</content>
 <feedburner:origLink>http://rubenlaguna.com/wp/2010/09/19/training-specific-opening-with-rybka-aquarium</feedburner:origLink></entry>
 
 <entry xml:base="http://rubenlaguna.com/">
   <title>From textdrive to Joyent Shared Accelerator</title>
   <link href="http://feedproxy.google.com/~r/RubensBlog/~3/eHTFNTySYl4/from-textdrive-to-joyent-shared" />
   <updated>2010-08-18T00:00:00+02:00</updated>
   <id>http://rubenlaguna.com/wp/2010/08/18/From-textdrive-to-Joyent-Shared-Accelerator</id>
   <content type="html">&lt;p&gt;After delaying it for long, long time I finally moved from Textdrive to Joyent Shared Accelerator. The improvement has been considerable. The response time has halved (blue line), and after a few days I switched to &lt;a href="http://jekyllrb.com/"&gt;jekyll&lt;/a&gt; for the blog platform and the improvements has been event bigger!&lt;/p&gt;
&lt;p&gt;&lt;img src="/wp/wp-content/uploads/skitch/crawlstats.png" alt="" /&gt;&lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/RubensBlog/~4/eHTFNTySYl4" height="1" width="1"/&gt;</content>
 <feedburner:origLink>http://rubenlaguna.com/wp/2010/08/18/from-textdrive-to-joyent-shared</feedburner:origLink></entry>
 
 <entry xml:base="http://rubenlaguna.com/">
   <title>Fixing Disqus</title>
   <link href="http://feedproxy.google.com/~r/RubensBlog/~3/_vuzaGEp9rE/fixing-disqus" />
   <updated>2010-08-17T00:00:00+02:00</updated>
   <id>http://rubenlaguna.com/wp/2010/08/17/Fixing disqus</id>
   <content type="html">&lt;p&gt;I was checking the &lt;a href="http://www.disqus.com"&gt;Disqus&lt;/a&gt; threads for my site in the Disqus web page and I noticed that there was something wrong. Some threads had the wrong url, pointing to &lt;code&gt;http://localhost:4000&lt;/code&gt; and some had the wrong title (instead of the title the url was showing). I came to the conclusion that this was due to the fact that I&amp;#8217;ve been using disqus_developer=1 to test locally after migrating to Disqus and the threads that I visited for the first time locally got the local url (localhost) and the because disqus couldn&amp;#8217;t get the title from that url (since it was a local url) it assigned a title based on the (local) url.&lt;/p&gt;
&lt;p&gt;So I decided to fix it using the &lt;a href="http://groups.google.com/group/disqus-dev/web/api-1-1"&gt;Disqus &lt;span class="caps"&gt;API&lt;/span&gt;&lt;/a&gt; and I wrote the following script&lt;/p&gt;
&lt;script src="http://gist.github.com/527898.js"&gt; &lt;/script&gt;&lt;p&gt;that uses a &lt;a href="http://github.com/ecerulm/disqus/tree/startlimit"&gt;slightly modified&lt;/a&gt; version of the &lt;a href="http://disqus.rubyforge.org/"&gt;disqus ruby&lt;/a&gt;. I had to modify the disqus ruby because the &lt;a href="http://github.com/norman/disqus"&gt;original version&lt;/a&gt; can &lt;strong&gt;only&lt;/strong&gt; iterate over the first 25 threads.&lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/RubensBlog/~4/_vuzaGEp9rE" height="1" width="1"/&gt;</content>
 <feedburner:origLink>http://rubenlaguna.com/wp/2010/08/17/fixing-disqus</feedburner:origLink></entry>
 
 
</feed>
