Lisp

You are currently browsing articles tagged Lisp.

Esta semana me he peleado con un comportamiento extraño de mi intérprete de scheme: las recursiones funcionaban a veces sí, a veces no.
Finalmente y gracias a los compañeros de comp.lang.scheme se ha resuelto el misterio.

(define (factorial n)
(if (= n 0)
1
(* n (factorial (- 1 n)))))

En esta recursión tan básica, que calcula el factorial de un número hay un error grave que mete al intérprete en una torre de llamadas recursivas no resueltas (hasta agotar la pila). Salta a la vista (cuando te lo dicen) que (- 1 n) es distinto a (- n 1).
Cuando mi llamada recurente era del tipo (- 1 n) la expresión (factorial 2) generaba:
(factorial 2)
(* 2 (factorial (- 1 2))
(* 2 (factorial (-1))
(* 2 (* -1 (factorial (- 1 -1))))
(* 2 (* -1 (factorial (2))))

en definitiva: (* 2 (* -1 (* 2 (* -1 (* 2 ....

Así que el código correcto es:

(define (factorial n)
(if (= n 0)
1
(* n (factorial (- n 1)))))

Tags: ,

Los fanáticos de Lisp estamos de enhorabuena, acaban de publicar Arc lo que pretende ser el dialecto más conciso y potente de este lenguaje. Arc es un proyecto de Paul Graham y Robert Morris en lo que podría denominarse como la obtención del núcleo fundamental de Lisp.

Hace poco tenía una discusión sobre lenguajes de programación, Php vs Ruby vs Python vs Perl, etc… Finalmente llegamos al consenso de que no hay un mejor lenguaje, sino lenguajes más apropiados que otros para determinada tarea. Sin embargo, una ojeada al mítico La venganza de los Nerds nos basta para darnos cuenta de que en general los lenguajes tienden asintóticamente hacia Lisp… Da que pensar.

Un buen comentario sobre Arc se puede encontrar en el blog de Lisp at light speed, la nota de publicación del software en el blog de Paul Graham y por supuesto en la página oficial del proyecto.

Tags: , ,