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.
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.
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.
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.
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.