He oído a mucha gente defender las capacidades de LISP y sus omnipotentes macros. Si LISP es un lenguaje tan bueno, ¿por qué no se adopta más? ¿Qué problemas tiene LISP que le impiden (re)emerger como lenguaje popular? ¿Se trata de algo relacionado con el propio LISP ("¡esos paréntesis!" no es la respuesta, ¿verdad?), o con sus competidores (por ejemplo, el dominio de Java, .NET)?
Respuestas
¿Demasiados anuncios?He oído que la recursividad es difícil de entender para algunos programadores, así que esto puede ser un factor ya que la recursividad es tan crítica en el lenguaje. Personalmente, la recursividad no me parece muy difícil, pero he visto a muchos programadores luchar con ella (más bien los programadores del tipo 9-5 que miran desconcertados cuando mencionas fibonacci, o fruncen el ceño cuando intentas hablar de programación durante el almuerzo... pero estos son también probablemente un subconjunto razonablemente grande de programadores).
Nunca ha habido un entorno lisp ampliamente aceptado que:
- funciona en múltiples plataformas,
- es gratuito o barato de usar, y
- implementa completamente el estándar lisp.
Hay un montón de lisps diferentes, y todos tienen distintas ventajas/desventajas, la mayoría de las cuales no son compatibles.
Esto contribuye a la ausencia de una infraestructura fiable para las aplicaciones lisp, y otros lenguajes se han desarrollado en este sentido mientras la comunidad de lisp ha permanecido fragmentada.
- Conceptos erróneos populares que se autoperpetúan. (Sólo hay que ver los posts aquí. (a) Yo nunca siempre no pierda de vista los paréntesis cuando programe en Lisp. Mi editor lo hace por mí. (b) Scheme puede ser un lenguaje funcional, pero yo LOOP felizmente todo el día en Common Lisp, muchas gracias).
- Falta de una implementación estándar definitiva con muchos "Pilas incluidas".
- La exposición previa de los potenciales novatos a Scheme en un curso de lenguajes de programación, habiéndolo odiado, y el hecho de no buscar otros dialectos de Lisp porque se parecen superficialmente a Scheme. (Esto está relacionado con el número 1).
- Falta de una implementación bien soportada que funcione como un programador de C espera (es decir, utilizando un ciclo tradicional de edición-compilación-enlace-ejecución y pudiendo enlazar sin problemas el código C y Lisp).
- Falta de varias bibliotecas (aunque la situación está cambiando para mejor justo cuando estamos perdiendo el tiempo aquí).
- Falta de orientación clara para los novatos. Common Lisp práctico hace un muy buen trabajo proporcionando un tutorial/libro de texto de Lisp, pero todavía no parece ser lo suficientemente visible. Tampoco existe un verdadero portal de la comunidad en la web.
Si se observan todos los conceptos erróneos en estas respuestas, se verá que la razón número uno es que la comunidad de Lisp no ha conseguido una comercialización adecuada de Lisp.
En el pasado hubo muchos dialectos de Lisp. Los que sobreviven son básicamente 2: Common Lisp y Scheme, cada uno con diferentes puntos fuertes.
Scheme es un lenguaje minimalista en curso cuyos principales propósitos son servir de vehículo para proyectos de investigación y educar a los estudiantes en conceptos fundamentales sobre computación y computabilidad. Así, mucha gente se cabrea con él por la misma razón por la que se cabrean con las matemáticas o con cualquier otra disciplina educativa. Entonces, piensan que Scheme/Lisp es un juguete sin propósito en el mundo real.
CL es el estándar industrial ANSI Lisp, básicamente un lenguaje estándar muy robusto y completo "con pilas incluidas", con muchas implementaciones libres y rápidas y algunas comerciales de calidad con IDEs completos. No es esencialmente un lenguaje funcional, sino que es un lenguaje multiparadigma, aunque favorece predominantemente la programación imperativa y cuenta con un sistema de objetos muy robusto (CLOS). También cuenta con la famosa facilidad de las macros para adaptar el lenguaje a sus necesidades. Por último, pero no por ello menos importante, las implementaciones compilan a un código muy rápido y el tiempo de ejecución puede ser parcheado dinámicamente con nuevo código compilado sobre la marcha, posiblemente después de una cuidadosa sesión de depuración mientras el sistema todavía se ejecuta. La ausencia de reinicialización significa que no se pierde tiempo en detener los sistemas.
Los paréntesis sólo son un problema cuando: 1) sólo echas un vistazo superficial al lenguaje y ves lo que destaca; 2) no te das cuenta de que son una increíble ayuda de programación para los editores (edición estructurada en su máxima expresión, a menos que uses cosas primitivas como el bloc de notas); 3) no entiendes que es una de las razones por las que las macros Lisp son tan potentes (porque el código Lisp se representa como datos Lisp, una lista).
- Ver respuestas anteriores
- Ver más respuestas