miércoles, 9 de octubre de 2013

Tutorial lua en linux(modulos) parte 1

Este tutorial es un poco mas avanzado,para realizar este tutorial ya se deb saber como usar funciones,estructuras selectivas y variables. Cambien es bueno saber usar tablas pero aun no esta listo el tutorial de ellas aquí,cuando se tenga listo lo citare y se podrán leer los dos tutoriales para complementarse entre si.

Un modulo en teoría podríamos decir que es una variable que toma el contenido de un archivo,los módulos nos hacen fácil el trabajo a la hora de programar programas largos,ya que podemos dividirlos en subprogramas o módulos y resolver los problemas de forma mas sencilla.

Un modulo en lua es como un objeto,no tanto como en Perl que se usa para crear clases pero se parece a lo que seria una clase,también se parece mucho a la forma que usa módulos Python,asi que si ya lo conocen verán el parecido,es como una mezcla de referencias Perl y módulos Python.

Primero que nada vamos a usar módulos que están definidos por el sistema y luego crearemos nosotros mismos algunos.

Primero que nada los módulos los llamamos con la palabra especial require,como en otros lenguajes,los módulos del sistema en algunos casos no es necesario llamarlos,pero como he dicho antes es bueno para saber que usamos.

El modulo os:

Para llamarlo:

require 'os'

Los módulos pueden ser escritos en C o en Lua,tienen terminación .lua o .so,se guardan en el PATH de Lua por defecto,o en el caso de los que creamos en el mismo directorio.

No necesitamos usar la extensión a la hora de llamarlos.

El Path lo podemos consultar en el modulo package,de la siguiente manera desde la terminal:

lua -e 'print(package.path)'

Y los módulos de C:

lua -e 'print(package.cpath)'

Continuamos con el módulos os:

Como ya hemos llamado os,podemos usar sus funciones:

Por ejemplo podemos llamar variables de entorno con la función getenv:

Por ejemplo en la shell de bash podemos saber el usuario actual asi:

echo $USER

O el PATH de los programas del sistema así:

echo $PATH

En lua:

print(os.getenv("USER"))

print(os.getenv("PATH"))

Podemos borrar un archivo así:

os.remove("archivo")

Podemos renombrar un archivo así:

os.rename("viejo_nombre", "nuevo_nombre")

Podemos ejecutar un comando del sistema asi:

os.execute('date')

Para cerrar el programa:

os.exit(1)

Existen muchas librerías,pero ese es un ejemplo de como se pueden usar,otra cosa que se debe aclarar es que se puede cambiar el nombre del modulo como en python:

sistema = require 'os'

print(sistema.getenv("PATH"))

Bien ahora vamos a crear nuestro modulos:

Primero que nada el modulo lo guardamos en la carpeta donde estamos,si queremos crear una tipo biblioteca,ascendente al path actual podemos usar la notación de punto,por ejemplo:

Tenemos el sistema así:



A la hora de llamarlo usaríamos:

requite 'lib.modulo'

Bien vamos a crear un modulo,por ejemplo itimetux.lua:

vim itimetux.lua

Lo primero que vamos a hacer es que todo lo que usemos va a ser local,para amarrarlo dentro del modulo creamos una tabla local:

local itimetux = {}

Ahora podemos crear una función:

function itimetux.info()
    print("Version 1.0")
end

function itimetux.saluda(x)
    print("Hola "..x.." soy itimetux")
end

Luego tenemos que regresar el modulo,como esta todo amarrado basta con retornar la tabla:

return itimetux

Ahora en el programa principal,vamos a llamarlo pasandole el valor a una variable:

#!/usr/bin/env lua

itime = require 'lib.itimetux' -- Pasamos valor a una variable

itime.info()

itime.saluda("Atheyus")

Podemos usar funciones privadas haciéndolas locales y no metiendolas en la tabla que es el modulo,de esta manera podremos usar funciones privadas para nuestro modulo,por ejemplo:

local itimetux = {}

local function dominio() -- funcion privada
    return "http://www.itimetux.com"
end

function itimetux.info()
    print("Dominio : "..dominio())
    print("Version 1.0")
end

function itimetux.saluda(x)
    print("Hola "..x.." soy itimetux")
end

return itimetux

Ahora podemos usar la función privada desde el modulo pero no la podremos usar desde el programa principal.

Para no usar un nuevo nombre basta con hacer que la tabla no sea local,en vez de:

local itimetux = {}

Usamos:

itimetux = {}

Y en programa principal usamos:

require 'itimetux'

itimetux.info()


Hay otra manera de crear módulos,el cual es que no tengamos que usar una tabla,es un metodo mas raro,ya que tenemos que retornar cada función,pero se puede hacer de esta manera tambien:

local function dominio() -- funcion privada
     return "http://www.itimetux.com"
end

local function info()
    print("Dominio : "..dominio())
    print("Version 1.0")
end

local function saluda(x)
    print("Hola "..x.." soy itimetux")
end

return { info = info ,saluda = saluda} -- retornamos las funciones que usaremos en el programa principal,las demas seran privadas

En el programa principal se puede usar de la misma manera el modulo.

Vamos a hacer algo mas útil,vamos a crear un modulo que lea los contenidos de un directorio:

local function read(dir) 
    local _files = {} -- Creamos una tabla para guardar los archivos
    local i = 1
    for files in io.popen("ls "..dir):lines() do -- Iteramos con un pipe,que use ls(funcion del sistema)
         table.insert(_files,i,files) -- Insertamos en la tabla los archivos
         i = i + 1
     end
     return _files -- Regresamos una tabla con los archivos (return de la funcion)
end

return {read = read} -- Regresamos la funcion (return del modulo)

Ahora supongamos que le llamamos readdir.lua y lo tenemos en lib/,para llamarlo en el programa principal hacemos esto:

readir = require 'lib.readdir'

archivos = readir.read(".") -- Leemos los archivos del directorio actual

-- Y por ultimo iteramos:

for i=1,#archivos do -- De i al numero de elementos de la tabla
    io.write(string.format("Archivo %d : %s\n",i,archivos[i])) -- Formateamos la cadena
end




Eso es todo de la parte 1,faltan cosas mas avanzadas las cuales hacen uso de metatablas,entornos,etc,pero primero haré tutoriales sobre eso para que se entienda mejor.

No hay comentarios.:

Publicar un comentario

Los comentarios serán revisados antes de ser publicados.