<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	>

<channel>
	<title>Luanatic con features</title>
	<atom:link href="http://www.pplux.com/feed/" rel="self" type="application/rss+xml" />
	<link>http://www.pplux.com</link>
	<description>el blog de PpluX</description>
	<pubDate>Fri, 30 May 2008 10:01:20 +0000</pubDate>
	<generator>http://wordpress.org/?v=2.5.1</generator>
	<language>en</language>
			<item>
		<title>Real como la vida misma (II)</title>
		<link>http://www.pplux.com/2008/05/30/real-como-la-vida-misma-ii/</link>
		<comments>http://www.pplux.com/2008/05/30/real-como-la-vida-misma-ii/#comments</comments>
		<pubDate>Fri, 30 May 2008 09:59:39 +0000</pubDate>
		<dc:creator>PpluX</dc:creator>
		
		<category><![CDATA[PhD]]></category>

		<category><![CDATA[becas]]></category>

		<category><![CDATA[humor]]></category>

		<guid isPermaLink="false">http://www.pplux.com/?p=170</guid>
		<description><![CDATA[Ya he dicho más de una vez que los de PhD cómics me espían&#8230;.



y también&#8230; real como la vida misma I y extraordinariamente real.
]]></description>
			<content:encoded><![CDATA[<p>Ya he dicho más de una vez que los de <a href="http://www.phdcomics.com" onclick="javascript:urchinTracker ('/outbound/article/www.phdcomics.com');">PhD cómics</a> me espían&#8230;.</p>
<div class="alignCenter">
<a href="http://www.phdcomics.com/comics.php?f=1022" onclick="javascript:urchinTracker ('/outbound/article/www.phdcomics.com');"><img src="http://www.phdcomics.com/comics/archive/phd052808s.gif" alt="PHD" /></a>
</div>
<p>y también&#8230; <a href="http://www.pplux.com/2008/04/12/real-como-la-vida-misma/" >real como la vida misma I</a> y <a href="http://www.pplux.com/2008/04/12/extraordinariamente-real/" >extraordinariamente real</a>.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.pplux.com/2008/05/30/real-como-la-vida-misma-ii/feed/</wfw:commentRss>
		</item>
		<item>
		<title>gpu gems 2: online !</title>
		<link>http://www.pplux.com/2008/05/13/gpu-gems-2-online/</link>
		<comments>http://www.pplux.com/2008/05/13/gpu-gems-2-online/#comments</comments>
		<pubDate>Tue, 13 May 2008 08:50:22 +0000</pubDate>
		<dc:creator>PpluX</dc:creator>
		
		<category><![CDATA[Gráficos]]></category>

		<category><![CDATA[Libros]]></category>

		<category><![CDATA[OpenGL]]></category>

		<category><![CDATA[Programación]]></category>

		<category><![CDATA[gpu]]></category>

		<category><![CDATA[nvidia]]></category>

		<guid isPermaLink="false">http://www.pplux.com/?p=169</guid>
		<description><![CDATA[No sé para qué me gasto el dinero, pero me alegro de que Nvidia esté &#8220;liberando&#8221; los gpu gems. 
No están todos, cada semana tres capítulos nuevos, así nadie se atraganta  
Relacionadas: gpu gems online
]]></description>
			<content:encoded><![CDATA[<p>No sé para qué me gasto el dinero, pero me alegro de que Nvidia esté <a href="http://news.developer.nvidia.com/2008/05/gpu-gems-2---on.html" onclick="javascript:urchinTracker ('/outbound/article/news.developer.nvidia.com');">&#8220;liberando&#8221; los gpu gems</a>. </p>
<p>No están todos, cada semana tres capítulos nuevos, así nadie se atraganta <img src='http://www.pplux.com/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' /> </p>
<p>Relacionadas: <a href="http://www.pplux.com/2008/03/26/gpu-gems-publicado-online/" >gpu gems online</a></p>
]]></content:encoded>
			<wfw:commentRss>http://www.pplux.com/2008/05/13/gpu-gems-2-online/feed/</wfw:commentRss>
		</item>
		<item>
		<title>¿Qué sistema de ficheros usas?</title>
		<link>http://www.pplux.com/2008/04/29/que-sistema-de-ficheros-usas/</link>
		<comments>http://www.pplux.com/2008/04/29/que-sistema-de-ficheros-usas/#comments</comments>
		<pubDate>Tue, 29 Apr 2008 10:55:32 +0000</pubDate>
		<dc:creator>PpluX</dc:creator>
		
		<category><![CDATA[Personal]]></category>

		<category><![CDATA[humor]]></category>

		<category><![CDATA[reiserfs]]></category>

		<category><![CDATA[Solaris]]></category>

		<category><![CDATA[ZFS]]></category>

		<guid isPermaLink="false">http://www.pplux.com/?p=166</guid>
		<description><![CDATA[Yo&#8230; resierfs, sí el del tipo aquel que han condenado por matar a su mujer rusa que conoció por internet, &#8230; esa que se lió con su mejor amigo, que resultó ser un asesino en serie que mato a 8 personas, pero que afirma que no tuvo nada que ver con la muerte de la [...]]]></description>
			<content:encoded><![CDATA[<blockquote><p>Yo&#8230; resierfs, sí el del tipo aquel que han <a href="http://barrapunto.com/articles/08/04/29/0940241.shtml" onclick="javascript:urchinTracker ('/outbound/article/barrapunto.com');">condenado</a> por matar a su mujer rusa que conoció por internet, &#8230; esa que se lió con su mejor amigo, que resultó ser un asesino en serie que mato a 8 personas, pero que afirma que no tuvo nada que ver con la muerte de la rusa&#8230; bueno, ese que dice que la rusa está en rusia y que todo es un complot.
</p></blockquote>
<p>Ni que decir que <a href="http://en.wikipedia.org/wiki/ReiserFS" onclick="javascript:urchinTracker ('/outbound/article/en.wikipedia.org');">reiserFS</a> es un sistema de ficheros interesante, no? Yo en casa uso <a href="http://en.wikipedia.org/wiki/Zfs" onclick="javascript:urchinTracker ('/outbound/article/en.wikipedia.org');">ZFS</a> bajo <a href="http://opensolaris.org/os/" onclick="javascript:urchinTracker ('/outbound/article/opensolaris.org');">Solaris</a>&#8230; a ver si algún día hay tiempo para explicar las ventajas de esto frente a un linux+raid+LVM+ext3/reiserfs/&#8230;</p>
]]></content:encoded>
			<wfw:commentRss>http://www.pplux.com/2008/04/29/que-sistema-de-ficheros-usas/feed/</wfw:commentRss>
		</item>
		<item>
		<title>Trabajar en consola: Terminator &#038; screen</title>
		<link>http://www.pplux.com/2008/04/29/trabajar-en-consola-terminator-screen/</link>
		<comments>http://www.pplux.com/2008/04/29/trabajar-en-consola-terminator-screen/#comments</comments>
		<pubDate>Tue, 29 Apr 2008 10:33:18 +0000</pubDate>
		<dc:creator>PpluX</dc:creator>
		
		<category><![CDATA[linux/unix]]></category>

		<category><![CDATA[recetas]]></category>

		<category><![CDATA[screen]]></category>

		<category><![CDATA[terminal]]></category>

		<category><![CDATA[terminator]]></category>

		<guid isPermaLink="false">http://www.pplux.com/?p=165</guid>
		<description><![CDATA[
¿Quién dijo que la consola estaba muerta? no śe vosotros, pero personalmente es de lo primero que arranco cada mañana para trabajar. ¿Por qué? pues sencillamente por ser invariante en el tiempo, gnome cambia, kde cambia, mac os X cambia, cada vez las interfaces son mejores, pero mi consola responde igual desde el primer día [...]]]></description>
			<content:encoded><![CDATA[<div class="floatRight"><img src="/files/terminator-logo.png" alt="Terminator logo" /></div>
<p>¿Quién dijo que la consola estaba muerta? no śe vosotros, pero personalmente es de lo primero que arranco cada mañana para trabajar. ¿Por qué? pues sencillamente por ser invariante en el tiempo, gnome cambia, kde cambia, mac os X cambia, cada vez las interfaces son mejores, pero mi consola responde igual desde el primer día que empecé a usarla. Más aun, te sirve para trabajar remotamente y muchas otras veces es la única opción para arreglar catástrofes (vamos, que no está de más aprender a usarla).</p>
<p>Pese a que a día de hoy hay aplicaciones gráficas para bajar ficheros, torrents, mover/copiar/pegar directorios, conectarse a unidades samba, etc&#8230; personalmente, en la mayoría de los casos, sigo prefiriendo arrancar una consola y hacerlo a mano, wget, cp/rm/mv/rsync, smbclient, smbfs, &#8230; ¿ya sabes, no?</p>
<p>Y si, como yo, eres un adicto a la terminal, conocerás <a href="http://www.gnu.org/software/screen/" onclick="javascript:urchinTracker ('/outbound/article/www.gnu.org');">screen</a> el multiplexador-de-terminales (si no, o si quieres aprender a usarlo, prueba <a href="http://www.kuro5hin.org/story/2004/3/9/16838/14935" onclick="javascript:urchinTracker ('/outbound/article/www.kuro5hin.org');">aquí</a> ) multiplataforma, super funcional, y con la maravillosa opción de poder <em>detachear</em> y <em>atachear</em> sesiones.</p>
<p>Y qué hacer con las pantallas de hoy día, son grandes, muy grandes, caben muchas consolas, o una a pantalla completa con screen (que permite dividir la consola en varias regiones)&#8230; pues mejor que eso podemos usar <a href="https://launchpad.net/terminator" onclick="javascript:urchinTracker ('/outbound/article/launchpad.net');">terminator</a>, del que ya podemos disfrutar en hoary. Terminator permite arrancar una terminal y, en vez de usar tabs, podemos dividir horizontal y verticalmente la consola las veces como queramos, sacando partido de verdad a los nuevos tamaños de pantalla que tenemos ahora.</p>
<blockquote><p>
<a href="https://launchpad.net/terminator" onclick="javascript:urchinTracker ('/outbound/article/launchpad.net');">Terminator</a>  is a program that allows users to set up flexible arrangements of GNOME terminals. It is aimed at those who normally arrange lots of  terminals near each other, but don’t want to use a frame based window manager.
</p></blockquote>
<p>Gracias a que usa gnome-terminals se integra muy bien con las preferencias de gnome-terminal (toma los colores que use este, el tipo de letra, control+, control-, etc..) y tiene atajos de teclado para cambiar de región (<em>$man terminator</em>).</p>
<p>¡ Un placer !</p>
]]></content:encoded>
			<wfw:commentRss>http://www.pplux.com/2008/04/29/trabajar-en-consola-terminator-screen/feed/</wfw:commentRss>
		</item>
		<item>
		<title>Enjuto también usa ubuntu!</title>
		<link>http://www.pplux.com/2008/04/24/enjuto-tambien-usa-ubuntu/</link>
		<comments>http://www.pplux.com/2008/04/24/enjuto-tambien-usa-ubuntu/#comments</comments>
		<pubDate>Thu, 24 Apr 2008 11:35:49 +0000</pubDate>
		<dc:creator>PpluX</dc:creator>
		
		<category><![CDATA[humor]]></category>

		<category><![CDATA[linux/unix]]></category>

		<guid isPermaLink="false">http://www.pplux.com/?p=164</guid>
		<description><![CDATA[Justo hoy, que estamos ya apunto con la nueva ubuntu 8.04, me pasan esto:


&#8220;os podéis ir a zurrir mierdas con un látigo&#8221;
Juas Juas Juas Juas
Visto en: Bitácora de JEsuSdA
]]></description>
			<content:encoded><![CDATA[<p>Justo hoy, que estamos ya apunto con la nueva <a href="http://www.ubuntu.com/" onclick="javascript:urchinTracker ('/outbound/article/www.ubuntu.com');">ubuntu 8.04</a></a>, me pasan esto:</p>
<div class="alignCenter">
<embed type="application/x-shockwave-flash" src="http://muchachadanui.rtve.es/uvideos/flvplayer.swf" style="video" id="flashplayer" name="flashplayer" quality="high" allowfullscreen="true" flashvars="autostart=false&amp;file=http://muchachadanui.rtve.es/enjuto-mojamuto-16.xml&amp;linkfromdisplay=true&amp;repeat=list" height="350" width="425"></embed></div>
<blockquote><p>&#8220;os podéis ir a zurrir mierdas con un látigo&#8221;</p></blockquote>
<p>Juas Juas Juas Juas</p>
<p>Visto en: <a href="http://www.jesusda.com/blog/index.php?id=221&#038;commented=1#c000958" onclick="javascript:urchinTracker ('/outbound/article/www.jesusda.com');">Bitácora de JEsuSdA</a></p>
]]></content:encoded>
			<wfw:commentRss>http://www.pplux.com/2008/04/24/enjuto-tambien-usa-ubuntu/feed/</wfw:commentRss>
		</item>
		<item>
		<title>lua API, introducción</title>
		<link>http://www.pplux.com/2008/04/16/lua-api-introduccion/</link>
		<comments>http://www.pplux.com/2008/04/16/lua-api-introduccion/#comments</comments>
		<pubDate>Wed, 16 Apr 2008 09:19:38 +0000</pubDate>
		<dc:creator>PpluX</dc:creator>
		
		<category><![CDATA[C/C++]]></category>

		<category><![CDATA[Lua]]></category>

		<category><![CDATA[Programación]]></category>

		<guid isPermaLink="false">http://www.pplux.com/2008/04/16/lua-api-introduccion/</guid>
		<description><![CDATA[Haciendo honor al nombre del blog, y aprovechando que recientemente me han comentado que el API de lua es un poco rara, vamos a hincarle el diente directamente al problema. Este post es sólo para programadores, no trata del léxico/sintaxis de lua, sólo de una parte muy particular del API, concretamente, la que más problema [...]]]></description>
			<content:encoded><![CDATA[<p>Haciendo honor al nombre del blog, y aprovechando que recientemente me han comentado que el API de lua es un poco rara, vamos a hincarle el diente directamente al problema. Este post es sólo para programadores, no trata del léxico/sintaxis de lua, sólo de una parte muy particular del API, concretamente, la que más problema da al programador que se está iniciando en esto de lua.</p>
<p>Veamos en primer lugar que es eso de un <strong>lua_State*</strong>, es fácil crearlo (luaL_newstate), y destruirlo (lua_close) y representa un estado completo de lua. A efectos prácticos es como si con cada lua_State fuera una máquina virtual independiente, por lo que podemos tener tantos como queramos (uno por thread, uno por efecto, uno por agente, etc, etc&#8230;).</p>
<div class="alignCenter"><img src="/files/lua101_lua_State.png" alt="state basics" /></div>
<p><span id="more-163"></span><br />
En la imagen vemos que un estado de lua ofrece básicamente  un <strong>stack</strong>(pila) para trabajar con el estado. Esto es lo más complicado de entender del API, pero una vez se ve en el contexto, es una forma super eficiente de trabajar. No voy a explicar hoy qué razón se oculta tras la pila, asumamos que es así y que hay que aprender a usarla.</p>
<p>También está representado en la imagen los tipos básicos de lua: strings, números, booleanos, funciones, tablas&#8230; y poco más. La estructura clave aquí es la tabla que es el único contenedor que tiene lua y se trata de un map de pares clave-valor. La clave puede ser cualquier tipo de lua y el valor, por supuesto, también.</p>
<p>Las funciones en lua también son tipos de primer orden, esto quiere decir que las funciones son un valor más que se puede copiar, asignar, devolver como resultado de otra función, etc. Como hemos dicho antes, las tablas incluso pueden usar funciones como claves, nada lo impide.</p>
<p>La linea de puntos de la imagen que separa el stack de la tabla global es para resaltar que no accedemos directamente a la tabla de valores globales. Para poder manejar la tabla de valores globales, u otra tabla, usaremos operaciones que apilarán o consumirán valores del stack. En resumidas cuentas <strong>siempre trabajamos con el stack</strong></p>
<div class="alignCenter"><img src="/files/lua101_stack.png" alt="stak" /></div>
<p>El stack se accede por índice, en lua los índices numéricos empiezan siempre en 1, en contraposición con lo típico en C/C++ de empezar todo en 0. También hay razones tras este acto de maldad, pero como somos programadores serios y profesionales, esto no es más que un detalle, y nos da igual.</p>
<p>Los índices pueden ser positivos, o negativos. Si son positivos contamos desde la base del stack y si son negativos desde el <em>top</em> del stack. Para saber el top actual, usamos lua_gettop(L). La mayor parte de las funciones, por no decir todas ellas, utilizan los valores cercanos al top&#8230; y lo divertido de esto, si has cursado alguna asignatura de compiladores, es que se parece mucho a la forma de trabajar en ensamblador para llamar a funciones <img src='http://www.pplux.com/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' /> </p>
<p>Bueno, para ilustrar todo lo anterior, y explicar con detalle un ejemplo del manual, vamos a ver paso a paso la ejecución del código equivalente a esta expresión de lua:</p>
<p><code><br />
a = f("how", t.x, 14)<br />
</code></p>
<p>según el manual se traduce en las siguientes instrucciones del API de lua:</p>
<p><code><br />
     lua_getfield(L, LUA_GLOBALSINDEX, "f"); /* function to be called */<br />
     lua_pushstring(L, "how");                        /* 1st argument */<br />
     lua_getfield(L, LUA_GLOBALSINDEX, "t");   /* table to be indexed */<br />
     lua_getfield(L, -1, "x");        /* push result of t.x (2nd arg) */<br />
     lua_remove(L, -2);                  /* remove 't' from the stack */<br />
     lua_pushinteger(L, 14);                          /* 3rd argument */<br />
     lua_call(L, 3, 1);     /* call 'f' with 3 arguments and 1 result */<br />
     lua_setfield(L, LUA_GLOBALSINDEX, "a");        /* set global 'a' */<br />
</code></p>
<p>Las instrucciones del API del <a href="http://www.lua.org/manual/5.1/manual.html" onclick="javascript:urchinTracker ('/outbound/article/www.lua.org');">manual</a> van acompañadas de una etiqueta de la forma  [<strong>-o</strong>, <strong>+p</strong>, x] :</p>
<ul>
<li> <strong>-o</strong>: número de elementos que consume del stack (pops from the stack) </li>
<li> <strong>+p</strong>: número de elementos que apila en el stack</li>
<li> x: tipos de errores que pueden saltar&#8230; esto es para otro día (así que como si no estuviera)</li>
</ul>
<p>Es fácil deducirlo pero las funciones de lua pueden devolver varios elementos, y por supuesto, consumir otros tantos. Las etiquetas vienen bien para saber de un vistazo de qué forma van a operar con el stack.</p>
<p>Volviendo al ejemplo anterior, supongamos que ahora mismo el stack está vacío, y veamos paso a paso cada una de las instrucciones. </p>
<div class="alignCenter"><img src="/files/lua101_a.png" alt="step_1" /></div>
<blockquote class="go"><p>
void <a href="http://www.lua.org/manual/5.1/manual.html#lua_getfield" onclick="javascript:urchinTracker ('/outbound/article/www.lua.org');">lua_getfield</a> (lua_State *L, int index, const char *k) [-0, +1, e]
</p></blockquote>
<p>Por la etiqueta sabemos que esta función no va a consumir nada del stack y siempre va a hacer push de un elemento. Esta función concretamente busca el elemento <em>key</em> de la tabla que está en el índice <em>index</em> y lo devuelve en el stack. Si el elemento no existe hará un push de &#8220;nil&#8221; que es otro tipo de datos, usado para indicar, precisamente, la ausencia de tipo de datos <img src='http://www.pplux.com/wp-includes/images/smilies/icon_biggrin.gif' alt=':D' class='wp-smiley' /> </p>
<p>LUA_GLOBALSINDEX es un pseudo-índice, en el stack no hay ninguna posición que permita acceder a la tabla de valores globales, así que hay una serie de pseudo-índices para acceder a ciertas tablas especiales (como la de los valores globales en concreto). Puedes imaginar ese índice de la forma que más te apetezca, a efectos prácticos es equivalente a poner un 1,2,&#8230; -1,-128, etc&#8230; en unos pasos veremos un getfield sobre una tabla en el stack para compensar. </p>
<div class="alignCenter"><img src="/files/lua101_b.png" alt="step_2" /></div>
<blockquote class="go"><p>
void <a href="http://www.lua.org/manual/5.1/manual.html#lua_pushstring" onclick="javascript:urchinTracker ('/outbound/article/www.lua.org');">lua_pushstring</a> (lua_State *L, const char *s) [-0, +1, m]</p></blockquote>
<p>Lua tiene unas cuantas funciones para meter y sacar elementos del stack, esta es una de tantas, y sirve para apilar un string. [Nota mental: <em>hablar de los strings de lua en otro post...</em>]</p>
<div class="alignCenter"><img src="/files/lua101_c.png" alt="step_3" /></div>
<p>Otro acceso a la tabla global, en este caso tras el <em>key</em> &#8220;t&#8221; se esconde una tabla, por lo que se apila una tabla. Lo he dibujado con otro color como alarde de creatividad, pero no es más que otro valor [booleano, string, funcion, tabla, numero....] metido en la tabla. </p>
<div class="alignCenter"><img src="/files/lua101_d.png" alt="step_4" /></div>
<p>Esta es más interesante, aunque la función es conocida. Se trata de un getfield de un elemento en la propia tabla, por lo que usamos un índice numérico para indicar de qué tabla queremos buscar la clave. Como el índice es <strong>-1</strong>, estamos haciendo referencia al top actual del stack, donde <em>voilà</em> está justo la tabla que acabábamos de apilar. </p>
<blockquote class="exclamation"><p><strong><em>¿Podíamos haber usado 3 cómo índice para acceder a la tabla?</em></strong><br />
sí, &#8230; pero mejor no te acostumbres. El &#8220;3&#8243; depende de todas las acciones que hayamos hecho antes, mientras que el -1 depende sólo de las últimas acciones sobre la pila. Así que&#8230; en general, es mejor usar índices negativos para este tipo de acciones puntuales.</p>
<p>En este caso queremos acceder al elemento &#8220;t.x&#8221; para hacer ejecutar &#8220;a = f(&#8221;how&#8221;, t.x, 14)&#8221;, si por ejemplo fuese &#8220;a = f(1,2,3,&#8221;how&#8221;, t.x, 14) ya no podríamos usar el índice 3 (usaríamos 6, al haber 3 elementos más en la pila), pero sí que podríamos seguir usando el -1.
</p></blockquote>
<div class="alignCenter"><img src="/files/lua101_e.png" alt="step_5" /></div>
<blockquote class="go"><p>void <a href="http://www.lua.org/manual/5.1/manual.html#lua_remove" onclick="javascript:urchinTracker ('/outbound/article/www.lua.org');">lua_remove</a> (lua_State *L, int index);         [-1, +0, -]</p></blockquote>
<p>Esta función, si miras la etiqueta, elimina un elemento del stack y no añade nada. Hay poco que explicar aquí, nos cargamos lo que esté en la posición apuntada por <em>index</em>. Al margen de la función, hemos conseguido obtener el elemento &#8220;t.x&#8221; para la llamada &#8220;a = f(&#8221;how&#8221;,<strong>t.x</strong>,14)&#8221; (bieeeen!)</p>
<div class="alignCenter"><img src="/files/lua101_f.png" alt="step_6" /></div>
<blockquote class="go"><p>
void <a href="http://www.lua.org/manual/5.1/manual.html#lua_pushinteger" onclick="javascript:urchinTracker ('/outbound/article/www.lua.org');">lua_pushinteger</a> (lua_State *L, lua_Integer n)         [-0, +1, m]</p></blockquote>
<p>&#8230; No hace falta dar detalles, ¿no? otro &#8220;lua_pushxxxx&#8221;</p>
<div class="alignCenter"><img src="/files/lua101_g.png" alt="step_7" /></div>
<blockquote class="go"><p>
void <a href="http://www.lua.org/manual/5.1/manual.html#lua_call " onclick="javascript:urchinTracker ('/outbound/article/www.lua.org');">lua_call</a> (lua_State *L, int nargs, int nresults);          [-(nargs + 1), +nresults, e]
</p></blockquote>
<p>Ahora vamos a realizar una &#8220;llamada a función&#8221; (un <em>call</em>) de <em>nargs</em> argumentos de entrada y esperando obtener <em>nresults</em> elementos de salida. Si miráis la etiqueta de la función pone que se consumen del stack nargs+1 elementos: n argumentos + 1 función. </p>
<p>El órden es el que podéis ver en el stack, primero la función apilada, después cada argumento en orden y llamamos a lua_call. Con esto ejecutamos la función tal y como se ve en la figura.</p>
<p>No sabemos el tipo del resultado devuelto, pero por la forma de llamar a call sabemos que siempre tendremos un elemento en la pila. Aquí lua realiza un proceso de ajuste: si la función devolvió 600 elementos, al poner nosotros lua_call(&#8230;, 1);  se queda con el primero y descarta los otros 599, si la función no devolvía nada (0 elementos) y nosotros queríamos 1, rellenará el espacio con nil&#8217;s , finalmente si queremos que la función devuelva todos los elementos que quiera, en vez de poner un numero en <em>nresults</em>, usamos la constante LUA_MULTRET ( y con ello se evita el proceso de ajuste ).</p>
<div class="alignCenter"><img src="/files/lua101_h.png" alt="step_8" /></div>
<blockquote class="go"><p>
void <a href="http://www.lua.org/manual/5.1/manual.html#lua_setfield" onclick="javascript:urchinTracker ('/outbound/article/www.lua.org');">lua_setfield</a> (lua_State *L,  int index, const char *k);          [-1, +0, e]
</p></blockquote>
<p>Para acabar, asignamos el resultado de la operación a la variable global &#8220;a&#8221;, usando lua_setfield (análogo a lua_getfield). La etiqueta nos dice que va a consumir un elemento y que no va a apilar nada. Con esto tenemos ejecutada toda la secuencia de &#8221; a = f(&#8221;how&#8221;, t.x, 14)&#8221;.</p>
<p>Nota:el call lo hicimos con lua_call(&#8230;,1) precisamente porque la intención era guardar el resultado en <strong>una</strong> variable ( gracias al ajuste nos da igual lo que haya devuelto la función ).</p>
<p>
Y hasta aquí el primer tutorial sobre el API de lua&#8230; para las dudas y aclaraciones, ahí tenéis los comentarios <img src='http://www.pplux.com/wp-includes/images/smilies/icon_biggrin.gif' alt=':D' class='wp-smiley' /></p>
]]></content:encoded>
			<wfw:commentRss>http://www.pplux.com/2008/04/16/lua-api-introduccion/feed/</wfw:commentRss>
		</item>
		<item>
		<title>disléxicos del mundo unisors!!!</title>
		<link>http://www.pplux.com/2008/04/13/dislexicos-del-mundo-unisors/</link>
		<comments>http://www.pplux.com/2008/04/13/dislexicos-del-mundo-unisors/#comments</comments>
		<pubDate>Sun, 13 Apr 2008 17:49:06 +0000</pubDate>
		<dc:creator>PpluX</dc:creator>
		
		<category><![CDATA[C/C++]]></category>

		<category><![CDATA[Personal]]></category>

		<category><![CDATA[humor]]></category>

		<guid isPermaLink="false">http://www.pplux.com/2008/04/13/dislexicos-del-mundo-unisors/</guid>
		<description><![CDATA[Después del primer mandamiento, viene el de &#8220;evitarás la disléxia&#8221;:


#ifndef __RESOURCE__
#define __RESORUCE__
...
#endif


Sabía cual era el fallo, sabía que era un define mal puesto, sabía incluso en qué fichero estaba dando problemas&#8230; y aun así no veía el problema XD
]]></description>
			<content:encoded><![CDATA[<p>Después del <a href="http://soledadpenades.com/2008/04/08/mental-note-about-ifndefs/" onclick="javascript:urchinTracker ('/outbound/article/soledadpenades.com');">primer mandamiento</a>, viene el de &#8220;evitarás la disléxia&#8221;:</p>
<blockquote class="exclamation">
<pre>
#ifndef __RESOURCE__
#define __RESORUCE__
...
#endif
</pre>
</blockquote>
<p>Sabía cual era el fallo, sabía que era un define mal puesto, sabía incluso en qué fichero estaba dando problemas&#8230; y aun así no veía el problema XD</p>
]]></content:encoded>
			<wfw:commentRss>http://www.pplux.com/2008/04/13/dislexicos-del-mundo-unisors/feed/</wfw:commentRss>
		</item>
		<item>
		<title>extraordinariamente real</title>
		<link>http://www.pplux.com/2008/04/12/extraordinariamente-real/</link>
		<comments>http://www.pplux.com/2008/04/12/extraordinariamente-real/#comments</comments>
		<pubDate>Sat, 12 Apr 2008 19:10:47 +0000</pubDate>
		<dc:creator>PpluX</dc:creator>
		
		<category><![CDATA[Personal]]></category>

		<category><![CDATA[humor]]></category>

		<guid isPermaLink="false">http://www.pplux.com/2008/04/12/extraordinariamente-real/</guid>
		<description><![CDATA[Más aun!!








Para los que me han tenido que soportar esta semana de &#8220;bugs&#8221; &#8220;features&#8221;  
]]></description>
			<content:encoded><![CDATA[<p>Más aun!!</p>
<div class="alignCenter">
<a href="http://www.phdcomics.com/comics/archive.php?comicid=1011"><br />
<img src="http://www.phdcomics.com/comics/archive/phd041108s.gif" alt="PHD" /></a>
</div>
<p><div class="alignCenter">
<img src="/files/build-slb.png" alt="slb builds!" />
</div>
</p>
<p>Para los que me han tenido que soportar esta semana de <strike>&#8220;bugs&#8221;</strike> &#8220;features&#8221; <img src='http://www.pplux.com/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' /> </p>
]]></content:encoded>
			<wfw:commentRss>http://www.pplux.com/2008/04/12/extraordinariamente-real/feed/</wfw:commentRss>
		</item>
	</channel>
</rss>
