Stack Overflow
marzo 06, 2014

Leo una entrada en Stack Overflow conmemorando su lanzamiento en la que el autor invita a los usuarios a crear el programa más pequeño posible que pueda causar un error de stack overflow.

He aquí una posible solución. No es pequeña, pero es interesante. Es algo que puede ocurrir en el uso diario y que provoca un stack overflow en casi todas las implementaciones de lenguajes que conozco.

La idea es tan simple como crear dos estructuras de datos extremadamente profundas y comprobar su igualdad. El siguiente ejemplo usa listas en Python.

>>> def deep_list(n):
        result = []
        for i in range(n):
            result = [result]
        return result

>>> deep_list(10000) == deep_list(10000)
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
RuntimeError: maximum recursion depth exceeded in comparison

La mayoría de implementaciones tienen en cuenta la longitud de las estructuras de datos a la hora de escribir el código que las compara, pero no su profundidad. El mismo código produce un stack overflow en las implementaciones actuales de Ruby, Lua, C#, Java y muchos otros lenguajes.

Lo mismo, escrito en Scheme y ejecutado en SISC.

> (define (deep-list n)
      (let loop ((ls '()) (n n))
          (if (zero? n)
              ls
              (loop (cons ls '()) (- n 1)))))

> (equal? (deep-list 10000) (deep-list 10000))
Exception in thread "main" java.lang.StackOverflowError
  at sisc.data.Pair.car(Unknown Source)
  at sisc.data.Pair.valueEqual(Unknown Source)
  at sisc.data.Pair.valueEqual(Unknown Source)
  ...

Dos excepciones notables: Scheme48 y Racket soportan listas de profundidad arbitraria, únicamente limitadas por la cantidad de memoria disponible en el sistema.

Cine mudo
octubre 20, 2013
    La tarde se debatía,
    entre el tedio y la pereza,
    qué hastío, qué aburrimiento,
    qué sopor y qué paciencia.

    ¿Y si vemos una peli?
    ¿Cuál quieres ver? ¿en qué piensas?
    Yo que mucho no pensaba,
    hice que le daba vueltas.

    Cariño, te va a salir,
    el humo por las orejas.
    Una neurona me dijo,
    que se declaraba en huelga.

    Esto pasa por robarle,
    horas de más a la siesta.
    Yo qué sé, elige tú,
    a mí me vale cualquiera.

    ¿Una de acción? ¿quizá un drama?
    ¿De terror? ¿una comedia?
    ¿Un cuento de los de antes,
    de príncipes y princesas?

    De alcobas, de torreones,
    de caballeros y trenzas,
    un malo que sea tan malo,
    que demuestre inteligencia.

    Buscadores de tesoros,
    romances, de cenicientas,
    un guión enrevesado,
    que sepa dejarte a medias.

    De piratas y motines,
    enanitos y doncellas,
    con soldaditos de plomo
    y mágicas habichuelas.

    Un perro que sepa hablar,
    una sirena sin lengua,
    con casitas de jengibre,
    conejos y madrigueras.

    Con un anciano hechicero,
    un niño que nunca crezca,
    una lámpara encantada,
    ladrones... unos cuarenta.

    Un cuento de los de siempre,
    que acabe con moraleja,
    de esos que solo hay,
    ahora en las bibliotecas.

    No supe qué contestar,
    ¡menuda lluvia de ideas!
    No te preocupes, tranquilo,
    que yo te doy la respuesta.

    De frente se me acercó,
    a un milímetro, muy cerca,
    plantándome un beso enorme,
    rodado a cámara lenta.

    Un crítico hubiese dicho,
    que fue toda una proeza,
    que era toda la cosa,
    un solo plano secuencia.

    Sin pensármelo le dije:
    Yo quiero volver a verla.

Otro poema, quizá un tanto largo para ponerlo aquí.

Si has llegado al final, te propongo un juego. ¿Puedes encontrar todas las referencias a cuentos infantiles que hay en el poema? Por ejemplo: "casitas de jengibre" es una referencia a Hansel y Gretel.

The shocking Miss Emerald
octubre 19, 2013

cover

Hacía tiempo que un grupo (o un artista) no me enganchaba tanto. Si no has escuchado ya algo de Caro, estás tardando en hacerlo. Qué voz. Aún no tengo claro si es jazz, tango, swing o qué, pero el caso es que la mezcla funciona a la perfección.

Magia de cerca
octubre 17, 2013
    Me dijo: tú mira, mira,
    Yo vaya que si miraba,
    los naipes sobre la mesa
    y nada bajo las mangas.

    Un truco te quiero hacer,
    tú memoriza una carta,
    el dos de copas, pensé,
    ni los bastos ni la espada.

    ¿Y los oros no te gustan?
    me gustan tus manos blancas.

    Cortó sin más, por el centro,
    dividiendo la baraja,
    pude observar que no había,
    cartón alguno ni trampa.

    Me miró como ese niño
    que algo esconde pero calla.
    ¿Será ésta? - yo le dije:
    ¡no puede ser! ¡esto es magia!

    Magia sí, pero de cerca,
    es magia sobre las palmas,
    una mentira tan bella
    hay que contarla en voz baja.

    ¿Te gusta, mi corazón?
    me gustan tus manos blancas.

Es un poema que escribí anoche y ahora comparto aquí. Creo que estoy razonablemente satisfecho con el resultado, aunque he de confesar que hace tiempo que no escribo poesía.

Un solo turno
octubre 16, 2013

La idea es singular y atractiva: aventuras conversacionales en las que el jugador solo puede ejecutar una acción y observar las consecuencias que se derivan de ella. No hay introducción ni desenlace, únicamente un fragmento entresacado de una historia mayor.

¿Suena interesante? Es la premisa de Aisle y de Rematch. La primera ya la conocía y es una de mis aventuras favoritas. La segunda... me ha decepcionado, quizá porque esperaba otra cosa.

Pese a que ambas comparten premisa, argumentalmente están situadas en polos opuestos.

Aisle es una exploración narrativa. No hay objetivo alguno. Funciona porque cada turno permite conocer algún detalle más sobre los personajes y su situación actual. Es como escoger al azar una página de un libro cerrado del que apenas recuerdas la sinopsis. Sin entrar en spoilers, es además una historia cercana con la que cualquiera puede identificarse.

Rematch es un puzle gigante con muchas partes móviles, un engranaje diseñado para ser descubierto a partir de la observación de cada elemento. El caso es que a pesar de lo ingenioso del puzle, al jugar tengo la sensación de que le falta algo. La necesidad de resolverlo inmediatamente le resta protagonismo a unos personajes que de por si no son muy carismáticos. El resultado de la mayoría de las acciones (hasta dar con la solución) es frustrante y repetitivo. El puzle es tan complejo, que el parser se ha extendido con construcciones nuevas para poder expresar la solución.

Una pena.