Puedes descargarte Lua 5.X o Lua Jit para interpretar código LUA.
Lua Rocks para bajarte módulos.
No tiene mucho módulo, tiene poca documentación, muchos errores y demás que tienes que subsanar por tu cuenta. Necesitas conocimientos intermedios-avanzados de sistemas para ir arreglando y configurando cosas muy básicas como puedan ser las rutas en las que se buscan los módulos usando un sistema virtual de ficheros.
El lenguaje en sí tiene un montón de cosas muy sencillas, pero también tiene otras cosas poco friendly para newbies como las patterns (las expresiones regulares de lua), lua sockets(no es ni librería std, por defecto no tiene modulo de red lua y es poco amigable el uso de sockets, las iteración de tablas, comprobaciones constantes para evitar que variables y tablas tengan nil, el stack de C tampoco es demasiado amigable, asique escribir módulos en C para lua tampoco es algo que aprendas a hacer en 2 minutos si no estás acostumbrado...
El lenguaje en sí es muy bueno y potente. El problema es la falta de soporte y la poca comunidad que hay.
A pesar de todo esto, se usa en un montón de programas. Principalmente suele usarse como "añadido" a juegos para tener una consola con la que configurar cosas del juego, hacer chats in-game y cosas similares.
También se usa mucho como lenguaje de scripting para todo tipo de programas. A parte de los que te comenta El Brujo, otro muy popular es Nmap y Ncat.
Nmap te permite agregar scripts para configurar el scanner o hacerle plugins para que haga otras cosas. Lo mismo con Ncat, donde puedes programar un montón de utilidades como podría ser el caso de un pequeño proxy ftp, dns, un scanner, etc.
Otro uso común es el de chicle entre diversas tecnologías y lenguajes. Dado su pequeño tamaño y su integración total con C, es común que se use para hacer de intermediario entre lenguajes o para unir componentes de un mismo lenguaje.
Una de las mayores ventajas es que corre en todos lados. Está bastante cerca del programa una vez, corre en todos los sitios, no tienes que andar haciendo condicionales y defines raros.
Es un lenguaje que dentro de lo que cabe, se aprende en muy muy poco tiempo, pero a pesar de ser un lenguaje potente, no es un javascript con 1000 metodos distintos de fábrica para unir strings, buscar texto, darle la vuelta... Está diseñado para traer lo mínimo indespensable y que tu personalmente le añadas exactamente lo que necesites usando librerías de tercero o las tuyas propias.
Yo lo suelo utilizar para servidores web y scripts para netcat, aunque no estoy muy contento con la librería de luasockets y todas las comprobaciones extra que acabo haciendo para cosas simples.
Este código son 3 funciones que hice para un servidor web y que comparto para poder comentar peculiaridades de la sintaxis y del lenguaje:
function split(string, pattern)
if string == nil or pattern == nil then return "" end
local lines = {}
for i in string.gmatch(string, pattern) do
lines[i] = i
end
return lines
end
Las funciones se definen con la palabra clave funcion.
Los condicionales no requieren parámetros.
Nil es literlamente nada. Viene del latín y en la práctica es similar al Null de otros lenguajes.
then y end se utilizan en lugar de los típicos corchetes de apertura y cierre respectivamente.
Local limita el alcance de las variables a la función en la que se encuentra
{} crea una tabla, que es un contenedor que sirve para muchas cosas distintas.
string.gmatch acepta un string y una pattern de lua para ir retornando el siguiente resultado de la búsqueda en cada iteración.
function read_config()
package.path = "./config/?.config;" .. package.path
local fd = io.open("./config/config.config", "r")
if not fd then
print("[debug]File not found")
end
local lines = fd:read "*a"
fd:close()
--print("File Content:\n" .. lines)
lines = split(lines, "([^\n]*)\n?")
for key, val in pairs(lines) do
val = string.lower(val)
if val == "use_static_headers[true]" then
print("[debug]Getting getting static headers")
server_headers = require("static_headers")
--[[for k, v in pairs(server_headers) do
print(k .. ": " .. v)
end]]--
elseif val == "custom_methods[true]" then
print("[debug]Getting getting custom methods")
server_methods = require("custom_methods")
--[[for i = 1, #server_methods do
print(server_methods[i])
end]]--
end
end
end
En esta función declaro de forma explicita la ruta que quiero añadir para que se busque en el sistema y le concateno el resto de package.path para que pieda seguir cargando módulos en las path originales.
A continuación leo todo el fichero con la opción *a.
Utilizo el método split que definí previamente usando una pattern para obtener todo lo que hay entre 2 saltos de linea.
Itero la tabla con pair para ptener el iterador y el valor.
Un poco más abajo hay un comentario multilinea.
El # es para obtener el length de un elemento.
[code=LUAfunction splitHeader(header)
local aux = ""
local index = 1
local key = ""
local value = ""
for i = 1, #header do
if header:sub(i, i) ~= ":" then
if aux == nil then
aux = header:sub(i, i)
else
aux = aux .. header:sub(i, i)
end
else
index = i
key = aux
break
end
end
for index = index + 1, #header do
value = value .. header:sub(index, index)
end
--print("KEY:" .. key .. "\nVALUE:" .. value)
-- value:match is removing leading/trailing spaces
return key, value:match("^%s*(.-)%s*$")
end[/code]
Espero que sirva mi explicación!