Trato de enseñarme un nuevo lenguaje de programación en intervalos regulares de tiempo. Recientemente, he leído cómo Lisp y sus dialectos están en el extremo opuesto completo del espectro de lenguajes como C / C ++, lo que me hizo sentir la curiosidad de saber más al respecto. Sin embargo, dos cosas no están claras para mí, y estoy buscando orientación sobre ellas:
¿Todavía se practica / usa LISP en el mundo de hoy, o es un lenguaje heredado como FORTRAN / COBOL? Quiero decir, además de mantener el código existente, ¿se usa en proyectos nuevos?
¿Cuál es el dialecto más utilizado? Me encontré con Scheme y Common Lisp como los 2 dialectos más frecuentes, y quería tu opinión sobre cuál es el más favorecido / útil para aprender, y me agradaría enormemente si puedes sugerir cualquier recurso para que un principiante comience.
Si bien estoy ansioso por aprender un idioma que es fundamentalmente diferente de los lenguajes de procedimiento a los que estoy acostumbrado, no quiero invertir un esfuerzo indebido en algo si es totalmente obsoleto; todavía lo aprendería si estuviera profesionalmente "muerto", pero solo con una perspectiva académica ...
Respuestas:
Prefiero Scheme, si quieres trabajar con la JVM deberías consultar Clojure, que es un lisp diseñado para funcionar en la JVM. ¡Y sí, Lisp todavía vale la pena aprender a ver cuán poderoso puede ser un diseño tan minimalista! La gente que creó lisp hizo algunas cosas realmente bien. ¡Es sorprendente cuántas de las nuevas y geniales características de los idiomas modernos tenía lisp en la década de 1960!
Para un esquema embebido intente engaño: http://www.gnu.org/s/guile/
fuente
En respuesta a la pregunta 2, "Dialecto más utilizado":
Depende de cómo interpretes "Más utilizado". Aquí hay algunos cálculos matemáticos de servilletas para los límites inferiores sobre cuánto uso tiene cada uno de los pocos dialectos elegidos.
La mayoría del código en bruto escrito
Ganador: Esquema o Common Lisp. Demasiadas incógnitas.
La mayoría del código de 'producción'
Ganador: supongo que Common Lisp . Creo que podemos responder "Sí" a la pregunta 1 según el uso de Common Lisp y Clojure.
La mayoría de los usuarios finales
Ganador: Scheme tiene el mejor límite inferior aquí, ya que hay números de ventas en Uncharted, pero es bastante discutible.
Conclusión
En conclusión, me parece que las manzanas grandes.
fuente
Sí, lo es, pero tienes que saber dónde buscar. Las personas que usan LISP no tienden a gritar demasiado alto al respecto, pero hay algunos ejemplos de algunas nuevas empresas de alto perfil que lo han usado con gran efecto en los últimos 20 años. También es muy popular entre las pequeñas empresas en Europa.
Esta es una pregunta válida, pero no es fácil de responder. También puede no ser particularmente útil para responder: muchas implementaciones tienen un enfoque específico, por lo que es mejor elegirlas si se ajustan a su problema particular en lugar de basarse en qué tan ampliamente se usa. En cambio, te contaré un poco sobre tus opciones y puedes decidir por ti mismo.
LISP es una familia de idiomas y cada uno de esos idiomas tiene una familia de dialectos e implementaciones. En general, los dialectos se dividen en dos campos: "LISP" y "Esquemas".
LISP: hasta hace relativamente poco, Common LISP era el rey. Fue un intento de unificar todos los LISP dispares y, sin ser cruel, fue el "C ++" de LISP. Es decir, era un lenguaje ENORME . Lo tenia todo. En los últimos años, Clojure ha aparecido. Clojure es un LISP que se ejecuta en la máquina virtual Java e intenta arraigarse en una filosofía de programación funcional. Tradicionalmente, otros LISP han sido estrictamente multi-paradigmáticos. Clojure es interesante porque obtiene lo mejor y lo peor de LISP y JVM. Todavía hay mucha verbosidad de los lenguajes basados en Java y han sido bastante gratuitos y fáciles con la sintaxis, por lo que tienen muchos botones y botones para diferentes cosas, pero realmente tienen algunosideas interesantes sobre los tipos de datos, especialmente algunas de las formas prácticas que se les ocurrieron para aplicar ideas desde la programación funcional.
Esquemas: los esquemas son un subconjunto estricto de LISP. El esquema fue inventado por Steele y Sussman y en la vida temprana fue notable por ser utilizado en el curso de conferencias 101 de informática del MIT. El esquema se define en el "Informe revisado ^ n sobre el esquema de lenguaje algorítmico (RnRS)". Sí: tienen una broma de matemáticas allí. Scheme es un lenguaje estandarizado de una manera que otros LISP no lo son. Esto ayuda mucho con la portabilidad entre implementaciones, pero no es una bala de plata. Los esfuerzos de estandarización han tendido a ser conservadores y las innovaciones en las implementaciones, especialmente en torno a cosas como los módulos, han tendido a ser dispares. También hay una serie de SRFI (Solicitudes de esquema para implementación) que es similar al proceso RFC del IETF. La gente lo usa para estandarizar cosas pequeñas según sea necesario.
Los esquemas son diferentes de los LISP porque tienen un conjunto de requisitos estrictos que deben cumplir, uno de los cuales es la "optimización de la llamada de cola", que ayuda a que la recursividad sea eficiente. Por lo tanto, los estilos recursivos de programación son mucho más populares en Scheme que en LISP. Scheme es, también sin ser cruel, como la "C" de LISP. Es decir, es un lenguaje pequeño y se supone que puedes tenerlo todo en tu cabeza a la vez.
Actualmente hay dos familias de esquemas: las basadas en la quinta versión (R5RS) y las basadas en la sexta versión (R6RS). La complejidad de R6RS fue mucho mayor que la de cualquiera de sus predecesores y muchas implementaciones de R5RS han optado por omitirlo, con la esperanza de que R7RS sea más similar a R5RS que R6RS. El proceso de estandarización de R7RS está actualmente en curso y ha tratado de incluir tanto los deseos de los implementadores de R5RS como los de la gente de R6RS estandarizando un pequeño lenguaje base en su primer grupo de trabajo y luego comisionando a un segundo grupo de trabajo para estandarizar las características más grandes. Esto permitirá que el lenguaje tenga implementaciones eficientes y útiles tanto en hardware embebido pequeño como en máquinas más capaces.
Ahora seré más específico:
PicoLisp es un LISP realmente genial. Es pequeño! Su autor lo escribió para sí mismo y, según tengo entendido, se ha ganado la vida desde la década de 1980. Si alguna vez tienes la oportunidad de asistir a una charla de él, entonces debes hacerlo: es realmente interesante y realmente sabe lo que hace y no obtendrás ni el más mínimo olfato de nada convencional o aburrido.
No estoy familiarizado con las implementaciones de Common Lisp, así que no comentaré más sobre ellas.
Guile es el esquema oficial de GNU.
Racket es un esquema R6RS pero últimamente parece haber ampliado la red y está tratando de "servir como plataforma para la creación, diseño e implementación del lenguaje".
Chicken pretende ser un esquema práctico. Se basa en R5RS y se compila en C. Esto resulta ser una ventaja muy, muy importante, ya que hace que sea absolutamente trivial usar bibliotecas C existentes. Por lo tanto, Chicken es probablemente el esquema más útil para reemplazar Perl, Python, Ruby, etc., como su lenguaje de programación diario. Hay varias personas que lo han usado exclusivamente para todas sus necesidades durante varios años. Tiene un REPL interactivo así como un compilador. La comunidad (tanto en la lista de correo como en IRC) está bien informada, es amigable y servicial.
Busque una implementación con muchos módulos: esto muestra que es ampliamente utilizable y significa que es probable que tenga algo que ayude con la tarea en cuestión.
Busque una implementación con un compilador o, al menos, algo que no esté estrictamente basado en IDE o REPL. Muchas de las implementaciones diseñadas para la enseñanza son muy difíciles de usar para secuencias de comandos de propósito general.
Recomiendo Chicken, ya que es lo que uso. Lo he usado en mis proyectos personales y lo he usado (y actualmente lo estoy usando) profesionalmente.
Scheme no está profesionalmente muerto, pero es posible que tenga que hacer todo lo posible para usarlo en ese contexto. Algo como Chicken es mucho más que una búsqueda académica y puede cubrir fácilmente casi todas las bases de los idiomas de alto nivel que utiliza actualmente.
fuente
Realmente no puedo hablar por todos los Lisps, pero Clojure es definitivamente un lenguaje candente y relevante en la actualidad. Un grupo de usuarios de Londres Clojure al que fui a principios de esta semana tenía más de 100 asistentes ...
Descubrí que es una experiencia muy esclarecedora aprender Lisp en forma de Clojure durante el año pasado (después de mucha experiencia con Java y C #). Las razones principales para esto son:
También parece ser una opción práctica para el uso real de producción por las siguientes razones:
Personalmente, sé de personas que usan Clojure en un par de bancos de inversión y nuevas empresas. También elegí Clojure como el lenguaje de desarrollo principal para mi propia startup, así que estoy dispuesto a poner mi dinero donde está mi boca :-)
fuente
Actualmente también estoy aprendiendo Lisp (y me encanta). Uso Common Lisp pero también me he metido con SBCL , Arc (nota, esa es la versión de Lisp de Paul Graham que, como lo mencionó Vitor Braga creó Yahoo store / Viaweb) y Allegro CL, que es similar a Visual Studio para Lisp (puede crear GUI, sin embargo, nunca lo he usado).
En cuanto a los usos, Lisp se ha utilizado mucho en Inteligencia Artificial, pero seré sincero, no estoy seguro de cuántos otros usos "generales" para Lisp. Muchos de los sitios web que se crearon en Lisp originalmente se han reescrito en otros idiomas, por lo que es difícil decir que se usa en el desarrollo web (sin decir que no, pero los sitios más grandes que lo usan ya no lo hacen). ) Después de hacer una búsqueda rápida (muy rápida) aquí hay una lista de software escrito en Common Lisp de Wikipedia .
[EDITAR] En cuanto a usar Lisp profesionalmente, hay trabajos que te obligarían a usar Lisp. No son tan numerosos como, por ejemplo, trabajos de Java o C #, pero existen. Creo que Lisp es uno de esos lenguajes que se usa para aplicaciones internas y puede proporcionar una ventaja competitiva que las empresas no quieren renunciar al anunciar que usan Lisp. Recuerdo haber visto una publicación en P.SE que decía que Smalltalk era similar en el ámbito financiero.
Además, ser capaz de demostrar que puede aprender diferentes paradigmas puede abrir más puertas incluso si no usa Lisp en el trabajo.
[/EDITAR]
fuente
Si quieres aprender Lisp hoy, echaré un vistazo a cualquiera de las raquetas, que es una implementación rápida del esquema (bueno, en realidad se alejó un poco del esquema, por lo que ahora es su propio dialecto) o clojure, que se beneficia de la JVM se ejecuta (por lo que hay disponibles miles de millones de bibliotecas, además puede hacer que interactúe con su propio código Java).
Incluso si no aprende a usarlo, aprenderlo siempre es beneficioso: aprende nuevas formas de pensar y lidiar con los problemas, incluso en otros idiomas, una vez que haya pensado en Lisp por un tiempo.
fuente
Una parte importante del backend de Amazon solía estar en Lisp, pero ahora se reescribió en C ++, o eso he oído (debo admitir que no tengo una fuente confiable para esto).
Yahoo! Stores es uno de los ejemplos clásicos de aplicaciones web de Lisp. De Yahoo! Almacena la fama que quizás hayas oído hablar de Paul Graham . Graham es uno de los defensores más conocidos de Lisp y escribe extensamente sobre este tema. Es posible que desee leer su sitio para conocer sus puntos.
AutoCAD solía tener un dialecto Lisp para su sistema macro. No sé si aún lo hace.
Scheme es un lenguaje limpio y muy elegante. Probablemente sea mi lenguaje de programación favorito, por lo que puedo estar sesgado. Si iba a escribir en este momento una aplicación importante, probablemente escribiría una aplicación esqueleto en C, ampliaría y definiría las reglas de negocio en Scheme. Esto me permite usar Scheme y aprovechar C, para la velocidad y la gran disponibilidad de bibliotecas para casi todo.
fuente
Conozco a varios tipos que hacen Lisps en algunas startups en Silicon Valley, y sé que Amazon.com ha estado usando Lisp desde el principio (¿aunque he oído que lo están reemplazando con C ++ por alguna razón?)
Pero una compañía a tener en cuenta es Naughty Dog . Todos sus juegos están escritos con un dialecto Lisp. Originalmente, rodaron los suyos, pero usan MZScheme en la serie Uncharted.
Apostaría a que Common Lisp, Clojure, Scheme y Emacs Lisp son los cuatro dialectos más utilizados, y sospecho que Scheme es el más comúnmente implementado. No tengo nada para respaldar esto, por supuesto. :)
Prefiero SICP y Little Schemer, como lo sugirieron otros, pero también sugeriría Land of Lisp , que es una lectura bastante entretenida. :)
fuente
Creo que depende en parte de lo que quiera hacer con él: si está buscando profundizar sus conocimientos sobre los diversos conceptos de programación y convertirse en un mejor programador, entonces diría que vale la pena aprender al menos un poco de Lisp. Si está buscando otro idioma para agregar a su currículum con el fin de conseguir un trabajo que funcione con este idioma, probablemente desee buscar en otro lado. No hay tantos trabajos de Lisp por ahí.
Personalmente trato de usar SBCL o más recientemente, Clojure (y algunos Emacs Lisp, pero htat porque soy un usuario de Emacs a largo plazo; intentaría aprender Emacs Lisp cuando intento aprender Lisp). Ahora todo lo que necesito hacer es encontrar el tiempo para jugar con esos idiomas ...
fuente
No sé si hay un montón de trabajos en LISP, ciertamente no puedo verlos. Pero sí recuerdo haber leído mucho tiempo acerca de una sonda de la NASA en la que ejecutaban LISP y podían insertar un nuevo código de la Tierra.
También en Nueva York el grupo de reunión de clojure es enorme. Supongo que si está interesado e ir a su grupo de reunión de clojure, puede encontrar oportunidades para establecer contactos y encontrar trabajos (no trabajos de clojure, sino cosas como Java / C ++ / etc.). Parece ser absolutamente enorme en el área de Nueva York, otras áreas pueden variar.
También LISP es una forma diferente de pensar. Además, LISP y SQL resultan en el uso de toneladas de expresiones anidadas. Usé SQL una tonelada y luego noté que LISP tenía más sentido. Pero si tiene problemas con SQL para acostumbrarse a paréntesis y expresiones super anidadas mientras usa LISP, probablemente hará que las expresiones SQL sean mucho más fáciles de entender.
Un ejemplo clásico es cómo implementar MAX (a, b, c). Podría hacer una función enrevesada con un montón de sentencias if. O simplemente podrías decir
MAX (MAX (a, b), c)
y use dos llamadas anidadas simples de los dos elementos MAX, que para mí es más fácil de leer. Aunque si el rendimiento es un problema, es posible que también desee hacerlo de otra manera, no me molesté en contar el número de comparaciones al usar cada método ... También si está implementando MAX a través de una macro C u otro método que evalúa el expresiones múltiples veces puede que no obtenga el resultado esperado ya que la expresión puede evaluarse varias veces, así que tenga cuidado con los efectos secundarios ...
fuente
MAX(MAX(a b) c)
Dos puntos adicionales:
Primero, Lisp es un gran lenguaje para escribir código en el que las interacciones entre funciones o datos son a menudo complejas. En muchos idiomas populares, si está confundido acerca de por qué su programa está haciendo lo que está haciendo, debe escribir funciones especiales que le permitan examinar el estado interno del programa a medida que avanza. En algunos idiomas, debe esperar a que se recompile su código. Por supuesto, puede haber herramientas como depuradores que ayuden con esto. Sin embargo, en Lisp, todo lo que necesita es una forma de detener el programa, y luego, por lo general, tiene acceso a todo en Lisp. En Common Lisp, a veces solo escribo ^ C, o llamo a
error
en una sola función (que es lo único que debe ser recompilado, y no tiene que hacer nada para recompilarlo). Una vez que detengo el programa, soy arrojado instantáneamente a un depurador, pero el depurador me da todo el poder de Lisp, y puedo salir del depurador, llamar a funciones específicas, etc. Puedo examinar fácilmente cualquiera de las estructuras de datos en mi programa La mayoría de los esquemas deberían permitir prácticas similares. Lisp no es único en este sentido, pero lo que ofrece va más allá de lo que ofrecen muchos idiomas populares.Segundo: si vas a experimentar con cualquier dialecto de Lisp, no lo haría sin (a) usar un editor que coincida con paréntesis, y (b) aprender la sangría adecuada de Lisp. Sería una buena idea utilizar un editor que también se aproxime a la sangría adecuada para usted. El formato de código C / C ++ / estilo Java está diseñado para idiomas con menos paréntesis / llaves / corchetes que Lisp. El estilo de impresión bonito de Lisp funciona bien una vez que está familiarizado con él, y no termina confundido por paréntesis ni pierde la mitad de su espacio poniendo un paréntesis de cierre por línea.
fuente
En este momento tengo la impresión de que Lisp se usa principalmente en tiendas de consultoría (no que las tiendas de consultoría lo usen principalmente).
Se considera un poco extraño para el software práctico. Sobre todo porque la gente no está acostumbrada, creo.
Tradicionalmente, Scheme es un dialecto bastante académico de Lisp, y Common Lisp era el dialecto de la industria.
Lisp es particularmente útil para la manipulación simbólica y las capacidades de reflexión.
Como ejemplo, el código que escribí para aprender Lisp era un programa que construía funciones lambda aleatorias, las evaluaba y luego las operaba, en un intento de minimizar la diferencia de la función con una función objetivo. Todo eso fue manipulación directa. En un lenguaje como C ++ o Java, habría tenido que inventar una representación para las funciones que la computadora manipularía.
fuente
Me gustaría agregar una perspectiva sobre Common Lisp y Scheme. He evitado clojure debido a la JVM, así que no tengo mucha perspectiva al respecto.
Scheme es un lenguaje hermoso, conciso y bien definido. Tomó muchas decisiones que CL tuvo que tomar debido al legado, y tomó el enfoque más puro. Por ejemplo, las variables y funciones están en el mismo espacio de nombres. El lenguaje predeterminado es más pequeño y conciso, lo que funciona bien para enseñarle el tipo de cosas en las que es bueno el lisp, por ejemplo, presiona el uso de la recursión en lugar de la iteración, ya que de forma predeterminada no tiene bucles iterativos y requiere la optimización de la cola de llamadas . Scheme tiene un macro sistema higiénico muy interesante, que tiene mucho valor para el aprendizaje. Pero en mi opinión, recomendaría aprender primero macros antihigiénicos de estilo CL, de los cuales la mayoría de los dialectos de esquema (?) Ofrecen al menos una implementación, incluso si no es parte de la especificación. Ya que parece que quieres aprender un idioma para aprender, yo '
Dicho esto, la comunidad de Scheme está fragmentada y, aparte de unos pocos bolsillos pequeños, parece estar principalmente dedicada a la investigación sobre cómo hacer un trabajo real ... Por ejemplo, cada dialecto tiene su propio administrador de paquetes, y los paquetes a menudo no son portátiles a través de dialectos, lo cual es un gran problema en la comunidad del esquema.
Common Lisp, por otro lado, parece ser el enfoque mucho más pragmático para desarrollar un lenguaje. El estándar es tal que gran parte del código lisp es portátil entre implementaciones, muchos compiladores son rápidos y están bien optimizados. Hay un gran conjunto de paquetes, muchos de los cuales son portátiles entre implementaciones. Y aparentemente se está creando una cantidad (comparativamente) grande de productos reales en el lenguaje. Y con say quicklisp, su administración de paquetes se siente razonablemente cerca de lo que obtendría en una comunidad moderna como decir Ruby o Node. CL, sin embargo, no carece de defectos, tiene una especificación muy grande en este punto en comparación con el esquema, e incluso su sistema de objetos CLOS, algo que tradicionalmente se escribe como una biblioteca en Lisps, es parte de la especificación IIRC. Y puede sentir el legado arraigado a través de una gran cantidad del sistema.
De lo contrario, dije que no podía hablar en clojure, y Emacs Lisp es claramente la opción apropiada si su objetivo es escribir extensiones de Emacs, y claramente no es la opción adecuada para otro software.
TLDR; Si su objetivo es aprender, recomiendo Scheme. Sin embargo, si desea crear software, recomendaría Common Lisp de las dos principales variantes de lisp.
fuente
Aprendí mucho de las respuestas. Gracias a todos los que contribuyeron a esta conversación esclarecedora.
Debo mencionar newLISP . Aunque difiere un poco de CL y Scheme, implementa muchas funciones muy útiles. El servidor http, la funcionalidad de procesamiento múltiple (Cilk) y las funciones de evaluación remota son muy limpias y fáciles de usar.
El único ejecutable es pequeño, rápido e incluye muchas baterías geniales.
fuente
Otro factor a considerar al elegir qué dialecto de Lisp aprender puede ser el número y la calidad de las implementaciones. Si un dialecto tiene solo una o dos implementaciones, entonces estás atrapado con sus fallas hasta que esas fallas se corrijan, y siempre existe la posibilidad de que la gente deje de refinar la implementación. En sí mismo, esa no es una razón para no usar un dialecto de implementación única de Lisp, pero es algo a tener en cuenta. Una ventaja de Scheme y Common Lisp es que hay muchas implementaciones de estos dialectos. Ambos idiomas han publicado estándares, por lo que es probable que las implementaciones relativamente recientes ejecuten el mismo código, principalmente. Algunas de estas implementaciones han existido desde hace mucho tiempo, pero aún están en desarrollo activo: ahora son implementaciones de alta calidad y aún se están perfeccionando.
fuente