Me he decidido a probar Lua, y esta es mi primer trabajo con él, se trata de una clase que maneja ficheros ini. Debido a que muchos os quejaís de como guardar o leer variables de un fichero y que muchas veces usáis 1 variable por fichero, creo que os será de utlidad. Voy a poner la documentación de sus funciones y unos ejemplos, así entenderéis mejor para que sirve y lo más importante: Cómo se usa.
No he podido probarlo con una PSP porque no tengo el intérprete hm7, mh7 o como se llame, en teoría (ya sabemos esto de las "teorías" en informática como van) funcionará sin problemas. Si alguien puede hacer el favor de testear los ejemplos o de usarlo en un proyecto propio, se lo agradecería.
Sobre Lua, decir que me ha desilusionado algo (pero no mucho ehhh ) , en el poco rato que he estado con él, ya he visto un par de cosas de las que carecía, como es la ausencia de la sentencia continue (menos mal que puede hacer un apaño), y que no tenga una función trim() nativa para cadenas.. También es un poco lioso crear una clase, porque en realidad se usan metatablas, un apaño un poco "chapucilla", pero que al menos funciona y da la sensación de que se está trabajando con clases de verdad. Bueno, no me enrollo más y os muestro la clase myConfig:
config = myConfig:Load(file)
Parámetros:
-file: fichero ini con la configuración.
Retorna un objeto myConfig y lee todos los valores del fichero.
config:GetValue(group, key, value, default)
Parámetros:
-group: Nombre del grupo.
-key: La clave dentro de ese grupo.
-default: Valor por defecto.
Retorna el valor guardado en el grupo "group" con la clave "key". Si la
clave no tiene ningún valor, retorna el valor por defecto.
config:GetSectionValues(group)
Parámetros:
-grupo: Nombre del grupo
Retorna una tabla con cada clave y valor que tiene la sección o grupo
indicado, si el grupo estuviera vacío o no existiera, devuelve una
tabla vacía
config:SaveValue(group, key, value)
Parámetros:
-group: Nombre del grupo.
-key: La clave dentro de ese grupo.
-value: Valor de la clave
El valor de la clave "key" del grupo "group" se escribe en el fichero.
config:StoreValue(group, key, value)
Parámetros:
-group: Nombre del grupo.
-key: La clave dentro de ese grupo.
-value: Valor de la clave
Igual que SaveValue(), pero no escribe en disco, sólo en la memoria RAM.
config:Save()
Escribe todos los valores en el fichero ini. Lo mejor es usarlo después
del último StoreValue() para escribir lo menos en disco.
IMPORTANTE CODERS DE PSP: Reemplazar io.write() por screen:print()
config.ini
[preferencias] Idioma=en Nombre=Johnny UltimaCancion=El rap del optimista.ogg [conexion] server=http://anyserver.cum/foo user= pass=**ENCRYPTEDPASSWORD**
sample1.lua
dofile("myconfig.lua") config = myConfig:Load("config.ini") name = config:GetValue("preferencias", "Nombre", "Usuario desconocido") lang = config:GetValue("preferencias", "Idioma", "es") lastSong = config:GetValue("preferencias", "UltimaCancion", "") io.write("Hola "..name.."\n") if lang ~= "en" then io.write(name..", ¡Tu configuración de lenguaje no es el inglés!\n") else io.write(name.. ", language is set to english!\n") end if lastSong ~= "" then io.write("¿Quieres escuchar "..lastSong.." otra vez?\n") end
La salida sería la siguiente:
Hola Johnny Johnny, language is set to english! ¿Quieres escuchar El rap del optimista.ogg otra vez?
sample2.lua
dofile("myconfig.lua") config = myConfig:Load("config.ini") serverName = config:GetValue("conexion", "server", "http://default-server.cum/default") userName = config:GetValue("conexion", "user", "anónimo") io.write("Tu usuario es "..userName.."\n") io.write("Cambiando nombre de usuario por johnny88...\n") userName = "johnny88" --StoreValue *NO* escribe en disco, usa SaveValue en su lugar o usa Save() al final config:StoreValue("conexion", "user", UserName) --Otras instrucciones.... --más ... --Antes de terminar... config:Save() --Salva al disco
La salida sería la siguiente:
Tu usuario es anónimo Cambiando nombre de usuario por johnny88..
Ahora config.ini tendrá el user con el valor johnny88
config.ini:
[preferencias] Idioma=en Nombre=Johnny UltimaCancion=El rap del optimista.ogg [conexion] server=http://anyserver.cum/foo user=johnny88 pass=**ENCRYPTEDPASSWORD**
Uso de GetSectionValues(). sample3.lua
dofile("myconfig.lua") config = myConfig:Load("config.ini") userList = config:GetSectionValues("users") for key, value in pairs(userList) do io.write("Nick: "..key..". Email: "..value.."\n") end
config.ini
[users] gorrister=seemysource [at] jmail [dot] cum johnny88=j88 [at] jotmail [dot] cum billy=billgates@micro$oft.com h0us3=doctorhouse [at] hospital [dot] cum
Salida:
Nick: billy. Email: billgates@micro$oft.com Nick: gorrister. Email: seemysource@jmail.cum Nick: johnny88. Email: j88@jotmail.cum Nick: h0us3. Email: doctorhouse@hospital.cum
Supongo que ya ha quedado claro la función de esta clase. Espero que os sea de utilidad en vuestros homebrews. Agradecer también a Arbër su ayuda ya que me aclaró unas dudas que le pregunte.
LuaDiE: Crea en Lua sin teclear código. Compatible HM7, HMv2, LuaPlayer, LuaDEV y PGE.
Menos mal que alguien de está
Menos mal que alguien de está comunidad aporta algo en condiciones.
Genial.
Simplemente genial. Yo me encargo de testearla y mandarla pa' portada ;-)
Un saludo.
Gracias
Te lo pregunto a ti directametne ya que vas a testearla, pero si alguien más puede aclararlo... Es sobre el screen:print(), y el io.write(), que hay una cosa que me ha extrañado mucho.
¿No hay nada de Lua para PSP, estilo io.write() en pantalla?, lo digo porque con screen:print, estás obligado a poner coordenadas (o eso creo), lo cual es bastante engorroso, sobretodo con estos pequeños programas de prueba y testeo en los que no hace falta que lo que se muestre sea "bonito", tan sólo que se muestre.
Un saludo.
LuaDiE: Crea en Lua sin teclear código. Compatible HM7, HMv2, LuaPlayer, LuaDEV y PGE.
No porque
De por sí Lua no tiene funciones gráficas de ningún tipo (que alguien me corrija si no es así) así que estás obligado a usar el screen:print() de los LuaPlayers de PSP, por lo que tendras que hacerlo por coordenadas, aún asi con unos simples calculos podrás centrar facilmente el texto en pantalla para no tener que estar usano coordenadas absolutas ;)
Un saludo.
-----[[7 años en Scenebeta, con la misma ilusión que la del primer día]]----
Que yo sepa no.
Para escribir en pantalla solo esta el screen:print(x,y,"texto",color) y el screen:fontPrint(fontHandler, x, y, "texto", color) (Todos estos parametros son necesarios. Si falta o sobra uno, te manda error.). Y creo que ninguno de estos dos lee el "\n". Simplemente lo escriben en pantalla.
Un saludo.
Para recibir ayuda por parte de otros usuarios más rápidamente, recomendamos que pongas títulos descriptivos y no utilices abreviaturas (estilo MSN) en tus post de los foros. Recuerda que accediendo al Manual del perfecto forero y las Normas de la Comunidad aprenderas trucos para resolver tus dudas antes.
No preguntes por MP, mejor pregunta aquí.
Bueno
Eso depende directamente del intérprete de Lua que estés usando ya que en LuaDev por ejemplo puedes poner los saltos de línea ("\n") y el programa te lo reconoce perfectamente y salta una línea ;)
Un saludo.
-----[[7 años en Scenebeta, con la misma ilusión que la del primer día]]----
=)
Me alegro de que lo hayas acabado ya. En realidad esto es bastante útil para ser usado como sample de guradar y leer datos de un fichero externo, en este caso config.ini, je, je. Y quita mi nombre de ahi hombre que me sonrojo, que para lo que te he ayudado... :P
Un saludo crack.
-----[[7 años en Scenebeta, con la misma ilusión que la del primer día]]----
juax!
Recién hace una semana hize una lib para C para manejar inis... xD iba a incluirse con luadev, pero viendo esto, ya no se si incluirlo xD (nah, si k tará. xD)
Actualmente desarrollando nuestra web y UXCode : http://www.gcrew.es
Ya sabes como es esto, la ley
Ya sabes como es esto, la ley de Murphy, cuando te enciendas el cigarro en la parada del autobús, éste aparecerá cruzando la esquina ^^. Bueno, ahora hemos pasado de no tener ninguno a tener 2, esperemos que esto no se convierta en un "ButtonsTesters". xDDD
La verdad es que me extrañó que no hubiera ninguna implementación de esto hecha en Lua, así que en vez del clásico HolaMundo, me puse a ello.
LuaDiE: Crea en Lua sin teclear código. Compatible HM7, HMv2, LuaPlayer, LuaDEV y PGE.
Sep
lua tiene algunas carencias de funciones básicas, (y otras no tanto), que intento recopilar y implementar. Algun ejemplo así de función básica, pero interesante, sería algo estilo "tokens"
string1 = "A:B:C:D";
numtok(string1,":") == 4;
gettok(string1,":",1) == "A";
Algo para separar tokens por ejemplo, y otras funciones, pero no son más k meros ejemplos, si bien su programación es sencilla, serán interesantes de tenerlas implementadas directamente en el luaplayer que tener que reescribirlas cada vez que se necesiten.
Actualmente desarrollando nuestra web y UXCode : http://www.gcrew.es
Funciones de cadenas
Si quieres ideas, sugerencias para nombrar las funciones que crees o concretar conceptos, mírate la documentación de cadenas de php
http://www.php.net/manual/es/book.strings.php
PHP es una pasada manejando cadenas, la mayoría pueden ser implementadas en Lua sin mucho esfuerzo.
Lo malo de programar en PHP es que luego hechas de menos la facilidad que tiene para manipular cadenas .
LuaDiE: Crea en Lua sin teclear código. Compatible HM7, HMv2, LuaPlayer, LuaDEV y PGE.
cierto
ya no me acordaba, mi amado explode! xD
Le exaré un ojo :D