martes, 27 de mayo de 2008

Azúcar sintáctico para XSymbol

Llevo toda la tarde dando vueltas a la práctica de Inteligencia Artificial de la universidad. Supuestamente hay que programarla en Lisp, aunque la primera versión la hice en BlitzMax, y ahora la estoy reprogramando en mi lenguaje funcional, XSymbol.

Ya le metí unas cuantas funciones nativas al lenguaje, al menos las necesarias para desarrollar la práctica, y un agradable añadido a la sintaxis.

Como había comentado en este post, XSymbol recibe un sólo parámetro en sus funciones. Si queremos pasar varios, los agrupamos en una lista y la enviamos. El problema es que para después acceder a cada uno de estos parámetros, lo tenemos que hacer leyendo el índice correspondiente de la lista, lo cual es un poco incómodo.

Para solucionarlo, he añadido un azúcar sintáctico al lenguaje que permite dar nombre a los elementos de una lista que recibimos como parámetro, y acceder a ellos por su nombre. Así, lo que antes sería:

@mifuncion lista

print get(lista 1)

print get(lista 2)

print get(lista 3)

;

Ahora queda simplemente como:

@mifuncion (p1 p2 p3)

print p1

print p2

print p3

;

Minutemen

Se ha publicado una fotografía de los Minutemen (el grupo de superhéroes que surgió hacia los años 30 en el comic de Watchmen) en su adaptación cinematográfica dirigida por Zack Snyder.

Además, se anuncia que el DVD de dibujos animados de Tales of the Black Freighter, una historia de piratas que aparecía en el cómic, será lanzado 5 días después del estreno de la película, y que habrá una edición Ultimate del DVD que contendrá los dibujos solapados con el resto de la película, tal como aparecían en el comic de Alan Moore y Dave Gibbons.

Y la imagen en cuestión:

Retrología Punta

Pensando en que la mayoría de blogs que leo por ahí tienen algún nombre original, y que mi "Blog de Jedive" quedaba muy soso, he decidido rebautizarlo como "Retrología Punta". No he tenido que darle muchas vueltas al nombre para acabar con esto. Un gran número de noticias que cuelgo en el blog son de temas de tecnología, y me vino a la cabeza la expresión "tecnología punta". Pero lo cierto es que tengo cierta debilidad por la tecnología antigua, los primeros ordenadores de los 80 y 90, y pensé que más bien la palabra a usar sería "retrología", que aunque pierde todo el significado de tecnología, creo expresa bastante bien muchas de las cosas que te puedes encontrar en este blog.

lunes, 26 de mayo de 2008

Mi nueva Amiga

Últimamente ando bien liado con trabajos de universidad, exámenes, y demás, pero ya tengo en casa algunas cosillas nuevas que he comprado.

Lo primero, un ordenador Amiga 500 que conseguí a través de eBay. Nada más me llegó, me fui con un cargamento de diskettes de 3.5" a casa de Seryu (que tiene un Amiga 500 y un 1200) a copiarme unos cuantos juegos para no aburrirme.

No puedo hacer mucho más con él que enredar con el Amiga Workbench 1.3, el sistema operativo que traía, debido a que para que funcionen los juegos no tienes más opción que tirar de joystick, y no tengo ninguno que funcione con el Amiga. Espero hacerme pronto con un Spectrum que venga con su joystick, y como éste funciona en el Amiga me debería servir.

El Workbench es bastante curioso. La selección de los colores es muy llamativa, con naranja intenso y azul chillón a más no poder (y nos quejamos de Ubuntu...), escogida para que pueda verse con nitidez en pantallas en blanco y negro o con bajo contraste. Otra curiosidad que tenía olvidada desde hace años, cuando probé un IBM PC 8086, es lo de trabajar sin disco duro. Introduces el disco del Workbench, y el sistema se carga en memoria (un sistema operativo en un disquete, qué lejos queda eso ahora). Si quieres copiar un disco, por ejemplo, tienes una utilidad para hacerlo. Te pide que introduzcas el disco de origen, vuelca en la memoria cuanto puede, te pide que insertes el de destino, copia lo que ha leído, vuelta a introducir el de origen... y así hasta que termina.

Lo que es increíble es la calidad gráfica de la que hace gala el Amiga. A pesar de tratarse del Amiga de baja gama, al ser con mucho el más vendido, fue para el que se hicieron la gran mayoría de los juegos, y en aquel momento hacían sonrojarse a cualquier juego de PC. Para echar un ojo a las joyas que salieron para esta plataforma, no hay más que pasarse por LemonAmiga y echar un vistazo al listado. Entre los juegos que me copié están el Batman: The Movie (uno de los pocos juegos que me pasé en el Spectrum), Eye of the Beholder II: The Legend of Darkmoon (maravilloso RPG que me hizo disfrutar en el PC 286 durante horas y horas), y otros clasicazos como el Worms.

Lo bueno es que el ordenador venía con su embalaje original, incluidos los manuales del Amiga (aunque estaba sin los discos de instalación, una pena...), y tiene bastante jugo echarles un vistazo y ver cómo trataban de explicar en aquella época lo que era un menú o un ratón.

La pena es que no tengo el Amiga BASIC para programar cosillas (espero que no requiriese un disco duro, ya que es el compilador de BASIC que incluía el Amiga 500). Tengo el PureBasic y el Blitz Basic 2, pero ambos requieren disco duro :( Trataré de encontrar por ahí el BASIC este.

Las otras compras que he hecho son el libro Revolution in the Valley de Andy Hertzfeld, uno de los creadores del primer Macintosh, y que relata cómo se llevó a cabo el desarrollo de este ordenador. Otro es Fire in the Valley, de Paul Freiberger y Michael Swaine, que narra cómo fueron los inicios de la informática personal (lo curioso es que la edición es de 1984, con lo cual no cuenta con mucha perspectiva histórica para el análisis), y el último es iWoz, autobiografía de Steve Wozniak, uno de los cofundadores de Apple.

sábado, 10 de mayo de 2008

Acojonando a los piratas

Curioso sistema antipiratería el que metieron en La Abadía del Crimen, juego español de Opera Soft, que fue publicado allá por 1988. Está considerado, a día de hoy, una de las obras maestras del videojuego universal.

Una curiosidad que he descubierto gracias al blog de JMV, es el sistema antipiratería que incluía el juego en su versión para PC. En la famosa escena de la misa, en la versión de PC sonaba un "Ave María" digitalizado. Pues bien, si estábamos jugando a una copia pirata del mismo, la canción era reemplazada por una voz que comenzaba a repetir "PIRATA".

Echad un ojo al vídeo, no me diréis que no quita las ganas de jugarlo pirata xD

miércoles, 7 de mayo de 2008

La otra cara de la moneda...

Aún estoy de piedra. Se ha filtrado una imagen de Aaron Eckhardt convertido en Dos Caras. El Joker ya era impresionante, apoteósico... y llega Dos Caras para rematarlo.

Bueno, podría ser un fake, pero Warner está intentando eliminar todo rastro de la fotografía, así que apostaría a que es auténtica. En cualquier caso, para aquellos que queríais mantener la sorpresa hasta el estreno, pondré enlace debajo y que lo vea quien quiera.

El link (SPOILER!!!).

lunes, 5 de mayo de 2008

Publicado de forma oficial el trailer de The Dark Knight

Ya se había filtrado hace unos días en la red, pero el pasado domingo fue colgado en internet de manera oficial por Warner Bros. Ya había hablado del trailer en otro post, así que simplemente os pongo enlace al mismo:

viernes, 2 de mayo de 2008

Creando un lenguaje funcional: XSymbol

El otro día estuve aprendiendo Lisp para realizar las prácticas de la asignatura Inteligencia Artificial de la carrera. Se trataba de mi segunda toma de contacto con un lenguaje funcional (la primera fue Caml). Mientras leía documentación sobre el lenguaje, me di cuenta de que era extremadamente sencillo realizar un intérprete para un lenguaje tipo Lisp, por una razón principalmente: los operadores prefijos. En Lisp, la operación suma por ejemplo, que en otros lenguajes de programación se escribiría a + b, se escribe + a b. Es decir, los operadores siguen la misma estructura que las funciones. Esto elimina la ambigüedad en la evaluación de expresiones, ya que el orden en que se evalúan las expresiones en una operación sólo puede ser de una determinada forma. Esto nos libra de la necesidad de utilizar los paréntesis para agrupar expresiones.

El caso es que iba leyéndome el manual de Lisp en el tren de camino a casa, y cuando llegué, abrí un fichero de texto y me puse a definir la sintaxis de este lenguaje. Quería que fuera claro, que tuviese el mínimo número de reglas y símbolos posible, que éstos fueran fácilmente reconocibles por familiaridad con otros lenguajes, y que fuera rápido a pesar de que el intérprete ejecutase directamente el código fuente (sin pasar a bytecode previamente).

Bien, el tema de la claridad implicaba hacer una serie de cambios sobre la sintaxis de Lisp. Lo de tener todas las expresiones encerradas entre paréntesis no me acaba de convencer, sobre todo porque es perfectamente posible hacer el analizador prescindiendo de ellos. Eliminándolos me quedaría un código más claro y además el intérprete tendría que leer menos cantidad de símbolos, optimizando la ejecución.

Lo de mantener las estructuras y símbolos del lenguaje en el mínimo posible facilita el aprendizaje del mismo. Básicamente un programa se agrupa en funciones. Existen los bloques IF... ELSE. Hay operadores aritméticos y lógicos estándar (cuyos símbolos se han tomado la mayoría de C), números decimales, y cadenas de texto (encerradas entre comillas como en C). No existen variables, si no que lo valores los obtenemos del retorno de las funciones a las que llamemos. Los identificadores sirven para refererirse a las funciones y al parámetro de las mismas (las funciones tienen un sólo parámetro, para pasarles varios valores podemos mandarlas una lista). Todas las expresiones devuelven un valor (un número devuelve el propio número, un string el string, las operaciones aritméticas el resultado de la operacion sobre los valores indicados, los operadores lógicos "1" si se cumple la expresión y "0" si no, los bloques IF... ELSE y las funciones el resultado de la última expresión ejecutada en ellas).

Respecto al tema de la velocidad de ejecución, gracias a los operadores prefijos se simplifica muchísimo el trabajo del evaluador de expresiones. También he hecho el lenguaje puramente simbólico. Los identificadores están limitados a definir nombres de funciones y de su parámetro. Muchos operadores son simbólicos en la mayoría de lenguajes, pero aquí otras operaciones, como la definición de una función o los bloques IF... ELSE son también símbolos (una función se define con @, el bloque IF con ?, y el ELSE con :). De esta forma, se reduce el número de caracteres a leer por el analizador.

Necesitaba un nombre para el lenguaje. Debido a su naturaleza simbólica, pensé en llamarlo Symbol, pero mi amigo Ferminho me convenció de que era poco google-friendly, y sugirió el nombre XSymbol. La idea me pareció genial, sobre todo porque en los programas de prueba que he hecho, las variables dummy de las funciones se llamaban x.

En dos días, tenía el intérprete corriendo, a excepción del soporte de listas, que acabo de añadir hace un rato (y me ha llevado apenas 5 minutos :)). Ahora me queda como primera tarea pendiente, realizar una biblioteca de funciones que permita que el lenguaje sea útil para algo (por ahora solo tiene la función print), y mejorar la gestión de los mensajes de error. Pero bueno, por ahora, ya puede ejecutar cosas como ésta:

@main x
print "Hola desde XSymbol!"
? <= 6 5 print "El primer valor es menor o igual al segundo" : print "El primer valor es mayor que el segundo"; print "Vamos a imprimir una lista:" print (-56 "Hola" (36 28) 48.7);

Como se ve, el símbolo "@" indica que vamos a definir una función. Se llama "main" (es el punto de entrada al programa, como en C), y como no vamos a utilizar su parámetro, lo hemos llamado "x" (ya he dicho que esto es una simple convención). Tiene una serie de llamadas a "print" que escriben distintos tipos de valores en pantalla, y un bloque de código condicional. La expresión comprobada es "<= 6 5", que devuelve 1 si el primer valor es menor o igual al segundo, y 0 en caso contrario. Como 6 es mayor que 5, devuelve 0 y se ejecuta la parte del ELSE, que viene a continuación del ":".

El ";" se utiliza para indicar el fin de una secuencia de expresiones, porque las funciones y los bloques IF... ELSE ejecutan un número variable de éstas. El IF se ejecuta hasta que encuentra su símbolo ":" correspondiente, que marcaría el comienzo del bloque ELSE. El ELSE se ejecuta hasta el ";" que marca su final. El último ";" marca el final de la función "main".

El resultado de la ejecución del programa es:

Hola desde XSymbol!
El primer valor es mayor que el segundo
Vamos a imprimir una lista:
( -56.000000000000000 "Hola" ( 36.000000000000000 28.000000000000000 ) 48.700000000000003 )

Presentación de Windows 1.0

Siempre me ha interesado la informática retro. Aunque las máquinas y sistemas operativos de hoy día son una maravilla, tengo una cierta nostalgia de cómo se hacían las cosas antes. Probablemente sea porque entonces era un niño y todo esto parecía desprender magia. Recuerdo cuando, a la vuelta del colegio, pasaba por delante de una tienda de informática (que ya no existe), y me quedaba embobado viendo las cosas del escaparate, como las carátulas de los juegos, o los ordenadores encendidos que había dentro.

De hecho, tengo costumbre de mirar muchos vídeos de software u ordenadores de hace años, sólo por los recuerdos que me traen, y porque me gusta ver cómo en aquella época se empezaban a introducir los conceptos que hoy en día nos son cotidianos a todos.

Antes, buscando vídeos en YouTube, me he encontrado con una presentación auténtica de las características de la primera versión de Windows, mucho antes de que fuera un entorno de uso común (ésto no llegó hasta la 3.11, y especialmente después con Windows 95). Windows 1.0 salió en 1985, así que la presentación será también de esas fechas. Aquí os la pongo:

Batman: Gotham Knight

Unos días antes de la salida de The Dark Knight en USA, Warner va a lanzar en DVD y Blu-Ray Batman: Gotham Knight, compuesto de 6 cortometrajes de animación realizados por distintos directores, en la línea de Animatrix.

Supuestamente, los cortos están basados en el universo de Batman Begins y The Dark Knight, pero parece que es así porque los de Warner lo dicen. La verdad que si querían haberlo hecho de esta forma, deberían haber forzado a los realizadores a que el Batman de los cortometrajes se pareciese EN ALGO al Batman de Christian Bale. A juzgar por el trailer, se pasan por el forro la estética de las nuevas películas, y cada uno hace más o menos lo que le da la gana. También hubiera sido de agradecer que Bale hubiese puesto la voz a Batman y no Kevin Conroy, y que la BSO estuviera basada en la de las películas (cosa que en el trailer parece que no es así).

En fin, esperemos que al menos las historias sean de calidad. Aquí os dejo el trailer: