Bienvenidos sean a este post, mas alla de lo que hemos visto en los anteriores posts los cuales intercambian valores entre C y la pila la API ofrece tambien los siguientes operadores para la manipulacion generica de la pila:
int lua_gettop (lua_State *L);
void lua_settop (lua_State *L, int indice);
void lua_pushvalue (lua_State *L, int indice);
void lua_remove (lua_State *L, int indice);
void lua_insert (lua_State *L, int indice);
void lua_replace (lua_State *L, int indice);
La funcion lua_gettop devuelve el numero de elementos de la pila el cual es tambien el indice del elemento de la parte superior de la pila, lua_settop setea el limite de superior de la pila, el numero de elementos de la pila, para un valor especifico y si el limite superior anterior era mas alto que el nuevo todos los valores de la parte superior son descartados, de lo contrario la funcion empuja nil en la pila hasta obtener el tamaño informado, un caso particular es utilizar lua_settop(L, 0) la cual vacia la pila, tambien podemos usar indices negativos con lua_settop, para el uso de esta facilidad la API ofrece la siguiente macro la cual quita un elemento de la pila:
#define lua_pop(L, n) lua_settop(L, -(n) - 1)
La funcion lua_pushvalue empuja en la pila una copia del elemento en el indice informado, lua_remove quita el elemento en el indice informado, moviendo hacia abajo todos los elementos en la parte superior de esta posicion para llenar el vacio, lua_insert mueve el elemento de la parte superior dentro de la posicion informada y por ultimo lua_replace quita un valor de la parte superior y lo setea como el valor del indice informado sin mover nada, las siguientes operaciones no tienen efecto sobre la pila:
lua_settop(L, -1) /* setea la parte superior a su valor actual */
lua_insert(L, -1) /* mueve el elemento de la parte superior a la parte superior */
El siguiente codigo usa la funcion pilaVolcado que vimos en el post anterior:
#include <stdio.h>
#include "lua.h"
#include "lauxlib.h"
static void pilaVolcado(lua_State *L)
{
int i;
int arriba = lua_gettop(L);
for (i = 1; i <= arriba; i++)
{
int t = lua_type(L, i);
switch(t)
{
case LUA_TOSTRING:
{
printf("'%s'", lua_tostring(L, i));
break;
}
case LUA_TBOOLEAN:
{
printf(lua_toboolena(L, i) ? "true" : "false");
break;
}
case LUA_TNUMBER:
{
printf("%g", lua_tonumer(L, i);
break;
}
default:
printf("%s", lua_typename(L, i));
break;
}
}
printf(" ");
}
printf("\n");
}
int main (void)
{
lua_State *L = luaL_newstate();
lua_pushboolean(L, 1);
lua_pushnumber(L, 10);
lua_pushnil(L);
lua_pushstring(L, "hola");
pilaVolcado(L);
lua_pushvalue(L, -4);
pilaVolcado(L);
lua_replace(L, 3);
pilaVolcado(L);
lua_settop(L, 6);
pilaVolcado(L);
lua_remove(L, -3);
pilaVolcado(L);
lua_settop(L, -5);
pilaVolcado(L);
lua_close(L);
return 0;
}
En este caso primero setearemos todas las librerias que necesitemos, despues usaremos la funcion que vimos en el post anterior y nuestro siguiente paso es ver el main, para ello crearemos una pila llamada L, a esta pila primero agregaremos un booleano (true), un numero (10), un valor nil y un valor de cadena (hola), nuestro siguiente paso sera mostrar la pila donde veremos un resultado como este:
true 10 nil hola
Nuestro siguiente paso sera agregar a la parte superior el valor de la posicion -4 (es decir el cuarto contando desde la parte superior a la inferior) donde obtendremos este resultado al hacer el volcado de nuestro pila:
true 10 nil hola true
Para el siguiente usaremos a lua_replace para reemplazar al indice informado con el de la parte superior, si lo ejecutamos y hacemos el volcado de memoria veremos esto:
true 10 true hola
En este caso se quito el valor de la parte superior y lo uso en el tercer indice haciendo desaparecer a nil, para nuestro siguiente paso cambiaremos la parte superior de nuestra pila, una vez ejecutado y hacer el volcado de la pila veremos lo siguiente:
true 10 true hola nil nil
Como no tenemos valores hasta la nueva parte superior la funcion lo completo con nil automaticamente, para nuestro siguiente paso usaremos a lua_remove para quita el tercer elemento desde la parte superior, una vez hecho y si mostramos el volcado de la pila veremos la siguiente salida:
true 10 true nil nil
En este caso vemos que se quito al valor de ‘hola’ y corriendo los valores anteriores para completar el vacio que se genero, por ultimo probamos de volver a setear la parte superior a un solo elemento, si hacemos el volcado de la pila quedara asi:
true
Como pueden ver quedo solamente el primer valor, si volvieramos a setear la parte superior con un valor superior se llenara de nil porque los valores anteriores han sido removidos de la pila, por ultimo usamos a lua_close(L) para liberar la pila, y devolvemos cero para mostrar que se salio correctamente.
En resumen, hoy hemos visto otras operaciones de la pila, como podemos manipular a la misma, un pequeño ejemplo, y los resultados de las distintas modificaciones de nuestra pila, espero les haya sido util sigueme en tumblr, Twitter o Facebook para recibir una notificacion cada vez que subo un nuevo post en este blog, nos vemos en el proximo post.
Tengo un Patreon donde podes acceder de manera exclusiva a material para este blog antes de ser publicado, sigue los pasos del link para saber como.

Tambien podes donar
Es para mantenimiento del sitio, gracias!
$1.50