¿Por qué debería aprender Lisp? [cerrado]

125

Realmente siento que debería aprender Lisp y hay muchos buenos recursos para ayudarme a hacerlo.

La sintaxis complicada no me desanima, pero en qué lugar de la "programación comercial tradicional" encontraría lugares tendría sentido usarlo en lugar de un lenguaje de procedimiento.

¿Existe una aplicación asesina comercial por ahí escrita en Lisp?

David
fuente
55
Difícil de desanimarse por lo que no está allí.
Kaz
Lea el currículum de Philip Greenspun . Está plagado de trabajo real de Lisp.
Kaz
1
También aquí . Greenspun trabajó en la simulación de red conmutada por paquetes, diseño DSP, diseño de procesador, diseño VLSI, automatización de ingeniería mecánica, automatización de movimiento de tierra, y así sucesivamente, todo utilizando Lisp o involucrando a Lisp. Ayudó a diseñar la arquitectura PA-RISC de Hewlett Packard utilizando herramientas desarrolladas en una máquina Lisp.
Kaz
Aquí hay algunas aplicaciones desarrolladas en Lisp - Emacs, G2, AutoCad, Igor Engraver y Yahoo Store
Arulx Z

Respuestas:

55

Uno de los principales usos de Lisp es en Inteligencia Artificial. Un amigo mío en la universidad tomó un curso de posgrado de IA y para su proyecto principal escribió un solucionador " Lights Out " en Lisp. Varias versiones de su programa utilizaron rutinas de IA ligeramente diferentes y las pruebas en aproximadamente 40 computadoras arrojaron algunos resultados bastante buenos (desearía que estuviera en algún lugar en línea para vincularme, pero no creo que lo sea).

Hace dos semestres usé Scheme (un lenguaje basado en Lisp) para escribir un programa interactivo que simulaba la rutina de "Quién está en primer lugar" de Abbott y Costello. La entrada del usuario se comparó con algunas estructuras de datos bastante complicadas (que se asemejan a mapas en otros idiomas, pero mucho más flexibles) para elegir cuál sería la respuesta adecuada. También escribí una rutina para resolver un rompecabezas de diapositivas 3x3 (un algoritmo que podría extenderse fácilmente a rompecabezas de diapositivas más grandes).

En resumen, aprender Lisp (o Scheme) puede no producir muchas aplicaciones prácticas más allá de la IA, pero es una experiencia de aprendizaje extremadamente valiosa, como muchos otros han dicho. La programación en un lenguaje funcional como Lisp también lo ayudará a pensar de manera recursiva (si ha tenido problemas con la recurrencia en otros idiomas, esto podría ser de gran ayuda).

Justin Bennett
fuente
55
¿Por qué dices que Lisp solo es bueno para la IA? Además, es un lenguaje multi-paradigmático. Funcional es solo uno de los varios paradigmas que permite.
Luís Oliveira
66
No dije que solo se usa para IA, dije que uno de sus principales usos es la IA. ¿Lo leíste?
Justin Bennett
32
"No asuma que Common Lisp solo es útil para bases de datos, marcos de prueba de unidades, filtros de spam, analizadores ID3, programación web, servidores Shoutcast, intérpretes de generación de HTML y compiladores de generación de HTML solo porque estas son las únicas cosas que se implementaron en the book Practical CL "
Mikael Jansson
23
@JustinBennett sí, lo dijiste. Aquí: "En resumen, aprender Lisp (o Scheme) puede no producir muchas aplicaciones prácticas más allá de la IA". Odio cuando las personas confrontan mientras se equivocan.
Luka Ramishvili
127

Lisp es un lenguaje grande y complejo con un tiempo de ejecución grande y complejo para admitirlo. Por esa razón, Lisp es el más adecuado para problemas grandes y complicados.

Ahora, un problema complejo no es lo mismo que uno complicado . Un problema complejo es uno con muchos pequeños detalles, pero que no es difícil. Escribir un sistema de reserva de aerolíneas es un negocio complejo, pero con suficiente dinero y programadores no es difícil. Obtener la diferencia?

Un problema complicado es uno complicado, uno en el que la división y conquista tradicional no funciona. Controlar un robot o trabajar con datos que no son tabulares (por ejemplo, idiomas) o situaciones muy dinámicas.

Lisp está realmente bien adaptado a problemas donde la solución debe ser expandible; El ejemplo clásico es el editor de texto emacs. Es totalmente programable y, por lo tanto, un entorno de programación en sí mismo.

En su famoso libro PAIP , Norvig dice que Lisp es ideal para la programación exploratoria. Es decir, programar una solución a un problema que no se comprende completamente (a diferencia de un sistema de reserva en línea). En otras palabras: problemas complicados.

Además, aprender Lisp te recordará algo fundamental que se ha olvidado: la diferencia entre Von Neumann y Turing. Como sabemos, el modelo de computación de Turing es un modelo teórico interesante, pero inútil como modelo para diseñar computadoras. Von Neumann, por otro lado, diseñó un modelo de cómo se ejecutarían las computadoras y la computación: el modelo de Von Neumann. Lo central del modelo de Von Neumann es que solo tiene una memoria y almacena allí tanto su código como sus datos. Observe cuidadosamente que un programa Java (o C #, o lo que quiera) es una manifestación del modelo de Turing. Establece su programa en concreto, de una vez por todas. Entonces espera poder manejar todos los datos que se le agreguen.

Lisp mantiene el modelo de Von Neuman; No existe un límite nítido y predeterminado entre el código y los datos. La programación en Lisp le abre la mente al poder del modelo Von Neumann. La programación en Lisp te hace ver viejos conceptos bajo una nueva luz.

Finalmente, al ser interactivo, aprenderá a interactuar con sus programas a medida que los desarrolle (en lugar de compilar y ejecutar). Esto también cambia la forma en que programa y la forma en que ve la programación.

Con esta introducción, finalmente puedo ofrecer una respuesta a su pregunta: ¿Encontrará lugares donde supere a los idiomas "tradicionales"?

Si eres un programador avanzado, necesitas herramientas avanzadas. Y no hay herramienta más avanzada que Lisp. O, en otras palabras: la respuesta es sí si sus problemas son difíciles. No lo contrario.

usuario7517
fuente
30
"pero con suficiente dinero y programadores no es difícil", dicho esto, dados suficientes programadores se hace imposible ;-)
Jonas Kölker
He leído sobre la capacidad de lisps para generar código sobre la marcha, pero también he leído que se puede compilar ... ¿existen implementaciones que puedan mezclar la ejecución interpretada y compilada? o que contienen su propio compilador?
centaurian_slug
@centaurian_slug: Sí, absolutamente. Eso es parte del poder. Cualquier versión que no se haya dañado deliberadamente tendrá su compilador / intérprete disponible en tiempo de ejecución. Entonces, por ejemplo, un desarrollador puede iniciar sesión en una conexión especial en su servidor web, hacer un poco de depuración, actualizar algunas definiciones de clase y función, y posiblemente recompilar lo que sea que dependía de esas definiciones si fuera necesario. Todo mientras el servidor está en funcionamiento. Probablemente no sea legal en una empresa preocupada por el cumplimiento de SOX, pero esa es una razón por la que las industrias usan lenguajes cerebrales como Java y C #
James
46

sintaxis complicada ??

La sintaxis para lisp es increíblemente simple .

Aplicación asesina escrita en lisp: emacs . Lisp le permitirá extender emacs a voluntad para hacer casi cualquier cosa que se le ocurra que pueda hacer un editor.

Pero , solo debes aprender lisp si quieres , y es posible que nunca puedas usarlo en el trabajo, pero aún así es increíble.

Además, quiero agregar: incluso si encuentra lugares donde lisp tenga sentido, probablemente no convencerá a nadie más de que debe usarse sobre java, c ++, c #, python, ruby, etc.

Justin Standard
fuente
@Justin: Probablemente valga la pena señalar que emacs core está escrito en C. Pero eso es solo una trampa: todos los comandos están escritos en elisp.
Bernard
3
o más bien, la sintaxis central de lisp común es simple. defmacro permite extender la sintaxis, y algunas de las macros integradas (como defmacro) pueden volverse increíblemente complicadas; listas anidadas lambda, apóstrofes, etc.
Aaron
Es casi justo decir que la parte C de emacs es código de pegamento.
Luka Ramishvili
De acuerdo con el manual de referencia de Emacs, "La mayoría de los comandos de edición en Emacs están escritos en Lisp; las pocas excepciones podrían haberse escrito en Lisp, pero usa C en lugar de eficiencia". gnu.org/software/emacs/manual/html_mono/emacs.html#Intro
dpritch
25

No puedo responder por experiencia de primera mano, pero deberías leer lo que escribió Paul Graham en Lisp . En cuanto a la parte de "aplicación asesina", lee Batir los promedios .

Christian Lescuyer
fuente
2
+1. Esta respuesta debería mencionar Yahoo Stores, la primera aplicación web, fue escrita parcialmente en lisp. Citando Wikipedia: en 1998, Yahoo! Inc. compró Viaweb por 455,000 acciones de Yahoo! acciones, valoradas en aproximadamente $ 49 millones, y renombradas Yahoo! Tienda.
Steven Lu
17

Programé en Lisp profesionalmente durante aproximadamente un año, y definitivamente vale la pena aprenderlo. Tendrá una oportunidad incomparable para eliminar la redundancia de su código, al poder reemplazar todo el código repetitivo con funciones donde sea posible y macros donde no. También podrá acceder a una flexibilidad incomparable en tiempo de ejecución, traduciendo libremente entre código y datos. Por lo tanto, las situaciones donde las acciones del usuario pueden desencadenar la necesidad de construir estructuras complejas dinámicamente es donde Lisp realmente brilla. Los populares programadores de vuelos de aerolíneas están escritos en Lisp, y también hay muchos CAD / CAM en Lisp.

John con waffle
fuente
9

Si te gusta la programación, debes aprender Lisp por pura alegría. XKCD expresa perfectamente la iluminación intelectual que sobreviene. Aprender Lisp es para el programador lo que la meditación es para el monje budista (y quise decir esto sin ninguna connotación blasfema).

Konrad Rudolph
fuente
9

Lisp es muy útil para crear pequeñas DSL. Tengo una copia de Lisp in a Box ejecutándose en el trabajo y he escrito pequeños DSL para interrogar las bases de datos del servidor SQL y generar capas de datos, etc. en C #. Todo el código de mi placa de caldera ahora está escrito en macros lisp que salen a C #. Genero HTML, XML, todo tipo de cosas con él. Si bien desearía poder usar Lisp para la codificación diaria, Lisp puede aportar beneficios prácticos.

Phil Bennett
fuente
Yo uso dotlisp.sourceforge.net/dotlisp.htm para esto.
Mark Hurd
5

Cualquier idioma se ve mucho más difícil cuando uno no usa las convenciones de sangría comunes de un idioma. Cuando uno los sigue de Lisp, ve cómo expresa una estructura de árbol de sintaxis con bastante facilidad (tenga en cuenta que esto no es del todo correcto porque la vista previa se encuentra un poco; las r deben alinearse con las fns en el argumento recursivo de clasificación rápida):

(defun quicksort (lis) 
  (if (null lis) 
      nil
      (let* ((x (car lis)) 
             (r (cdr lis)) 
             (fn (lambda (a) 
                   (< a x))))
         (append (quicksort (remove-if-not fn 
                                           r)) 
                 (list x)
                 (quicksort (remove-if fn 
                                       r))))))
John con gofre
fuente
1
Creo que hay una crítica justa en lo que dices. Solo quiero decir "se ve mucho más difícil como lo has presentado, y se ve mucho más claro como se presenta aquí". Creo que tendrías que estar de acuerdo en que muchos idiomas parecen mucho más confusos si no se siguen sus convenciones de sangría. Además, si comparamos la sangría de, digamos Java y Lisp, diría que generalmente requieren aproximadamente el mismo nivel de conocimiento de las construcciones básicas de cada lenguaje para sangrarlas correctamente. Pero, es justo, aunque completamente subjetivo, decir que todavía parece difícil.
John con gofres
1
Para hacerlo un poco más simple, puede usar el estándar lety usar un defunal comienzo de la función para definir fnque no cambia.
Aaron Robson
44
@FerretallicA ¿Sobre qué base determina usted si algo es "fácilmente legible para los humanos" o "autodescriptivo"? ¿Similitud con el inglés? ¿Es el chino "fácilmente legible para los humanos"? ¿Qué pasa con la notación matemática? ¿Es "no fácilmente legible por humanos"? Este tipo de argumento es una tontería molesta, porque su mensaje oculto es: "Esto no se parece a la forma en que aprendí a razonar".
3
Más bien, su "refutación" suena como "Whinge whinge". Prueba el lenguaje de programación sniff test. Tome a alguien que no haya programado antes y muéstrele una página de código VB y una página de código Lisp. Apuesto felizmente a mi tuerca izquierda en cuál de los dos el observador casual podrá extraer más fácilmente observaciones significativas.
nathanchere
1
Me pregunto qué pensaría un no programador chino, japonés, coreano, sumerio, hindú o árabe sobre su deseo más bien descarado de renunciar a su testículo por un argumento fácil.
4

Descubrí que aprender un nuevo idioma siempre influye en tu estilo de programación en idiomas que ya conoces. Para mí, siempre me hizo pensar de diferentes maneras para resolver un problema en mi idioma primario, que es Java. Creo que, en general, solo amplía su horizonte en términos de programación.

dlinsin
fuente
Es porque eres un buen programador. Los malos programadores, en lugar de influir en las viejas habilidades con nuevos conocimientos, piensan en idiomas ya conocidos mientras escriben en otros nuevos. Pero, ¿por qué estás usando Java después de lisp? :) Java es más difícil de usar después de Lisp, en mi opinión.
Luka Ramishvili
4

Si tiene que preguntarse si debe aprender lisp, probablemente no sea necesario.

Desconocido
fuente
8
Yo diría lo contrario: si ya entiendes lisp porque tienes experiencia con un lenguaje similar, entonces probablemente no sea necesario. Si no comprende lo que ofrece lisp, podría beneficiarse de la exposición.
Sr. Fooz el
@MrFooz no hay lenguajes similares que puedan eliminar la necesidad de aprender la parte lispy de lisp. Las principales características de lisp no se encuentran en ningún idioma. Aunque la mayoría lo son.
Luka Ramishvili
Dependiendo de tus objetivos. Si quieres morir, no necesitas respirar. Pero eso no significa que no debas.
mimoralea
4

Tomé una "clase de ceceo" en la universidad en los años ochenta. A pesar de Grokking todos los conceptos presentados en la clase, me quedé sin ningún aprecio por lo que hace grande a Lisp. Me temo que mucha gente ve el lisp como un lenguaje de programación más, que es lo que ese curso en la universidad me hizo hace muchos años. Si ve a alguien quejándose de la sintaxis de lisp (o la falta de ella), existe una buena posibilidad de que sea una de esas personas que no haya captado la grandeza de lisp. Fui una de esas personas durante mucho tiempo.

No fue sino hasta dos décadas después, cuando reavivé mi interés en el lisp, que comencé a "entender" lo que hace que el lisp sea interesante, de todos modos para mí. Si logras aprender lisp sin que te sorprendan los cierres y las macros de lisp, probablemente hayas perdido el punto.

fdesmet
fuente
Secundo que. Actualmente estoy en mi segunda incursión en Lisp, 5 años fuera de la escuela. Un término de Lisp cuando todavía estás verde puede no tener el efecto adecuado: recuerdo haberme enfocado solo en la metaprogramación y aún no aprecié la metaprogramación y la flexibilidad.
Aaron
4

Es posible que Learning LISP / Scheme no le brinde un mayor espacio de aplicación, pero lo ayudará a tener una mejor idea de la programación funcional, sus reglas y sus excepciones.

Vale la pena invertir tiempo solo para aprender la diferencia en la belleza de seis funciones puras anidadas y la pesadilla de seis funciones anidadas con efectos secundarios.

JT Hurley
fuente
4

De http://www.gigamonkeys.com/book/introduction-why-lisp.html

Uno de los mitos más frecuentes sobre Lisp es que está "muerto". Si bien es cierto que Common Lisp no se usa tanto como, por ejemplo, Visual Basic o Java, parece extraño describir un lenguaje que se sigue utilizando para nuevos desarrollos y que sigue atrayendo a nuevos usuarios como "muertos". Algunas historias de éxito recientes de Lisp incluyen Viaweb de Paul Graham, que se convirtió en Yahoo Store cuando Yahoo compró su compañía; El sistema de precios y compras de boletos aéreos de ITA Software, QPX, utilizado por el vendedor de boletos en línea Orbitz y otros; El juego de Naughty Dog para PlayStation 2, Jak y Daxter, que está escrito en gran parte en un dialecto de Lisp específico de dominio que Naughty Dog inventó llamado GOAL, cuyo compilador está escrito en Common Lisp; y el Roomba, la aspiradora robótica autónoma, cuyo software está escrito en L, un subconjunto de Common Lisp compatible con versiones anteriores. Quizás aún más revelador sea el crecimiento del sitio web Common-Lisp.net, que alberga proyectos de código abierto Common Lisp, y la cantidad de grupos de usuarios locales de Lisp que han surgido en los últimos años.

krdluzni
fuente
4

"Vale la pena aprender a Lisp por la profunda experiencia de iluminación que tendrás cuando finalmente la obtengas; esa experiencia te hará un mejor programador para el resto de tus días, incluso si nunca usas mucho Lisp".

--Eric S. Raymond, "Cómo convertirse en un hacker"

http://www.paulgraham.com/avg.html

eric.christensen
fuente
3

Estoy de acuerdo en que Lisp es uno de esos idiomas que nunca puede usar en un entorno comercial. Pero incluso si no lo hace, aprenderlo definitivamente expandirá su comprensión de la programación en general. Por ejemplo, aprendí Prolog en la universidad y, aunque nunca lo usé después, me dio una mejor comprensión de muchos conceptos de programación y (a veces) una mayor apreciación por los idiomas que uso.

Pero si vas a aprenderlo ... por supuesto, lee en Lisp

Adam Haile
fuente
Pequeña nota: en Lisp no es una introducción adecuada a Lisp, lea algo más primero. Recomiendo Practical Common Lisp.
Luís Oliveira
3

¡Aprender lisp pondrá Javascript en una luz completamente diferente! Lisp realmente te obliga a comprender tanto la recursividad como el conjunto de "funciones como objetos de primera clase" -paradigm. Vea el excelente artículo de Crockfords sobre Scheme vs Javascript . Javascript es quizás el idioma más importante en la actualidad, por lo que comprenderlo mejor es inmensamente útil.

Erlend Halvorsen
fuente
1
¿El idioma más importante? Creo que no, señor.
TraumaPony
77
Bueno, está disponible en casi cualquier dispositivo que tenga un navegador web (y probablemente algunos que no lo tengan), por lo que en lo que respecta a los idiomas para ejecutar aplicaciones de usuario final, probablemente tenga la mayor penetración de cualquier lenguaje de programación en el planeta . Obviamente, podría tener una opinión completamente diferente sobre lo que es importante. ¿Se usará para curar el cáncer? Probablemente no. Pero, nos guste o no, será una de las piedras angulares del desarrollo de aplicaciones (web) en los próximos años.
Erlend Halvorsen
1
Yo fui por el mismo camino! Aunque ya estaba usando las funciones funcionales y de creación de prototipos de Javascript, después de aprender Lisp, Javascript era un nuevo lenguaje para mí.
Luka Ramishvili
3

El Script-Fu de Gimp es tonto. Esa es una aplicación asesina de Photoshop.

Peter Turner
fuente
3

De acuerdo, podría ser extraño, pero realmente no me gustan tanto los ensayos de Paul Graham, y en Lisp es un libro muy rudo si aún no conoces Common Lisp. En cambio, diría que vaya a la práctica Common Lisp de Siebel . En cuanto a las "aplicaciones asesinas", Common Lisp parece encontrar su lugar en tiendas de nicho, como ITA , por lo que si bien no hay una aplicación sinónimo de CL como Rails es para Ruby, hay lugares en la industria que la usan si lo haces Un poco de excavación.

C Hogg
fuente
2

Sintaxis complicada? La belleza de lisp es que tiene una sintaxis ridículamente simple. Es solo una lista, donde cada elemento de la lista puede ser otra lista o un tipo de datos elemental.

Vale la pena aprender por la forma en que mejora su capacidad de codificación para pensar y usar las funciones como otro tipo de datos. Esto mejorará la forma en que codifica en un lenguaje imperativo y / u orientado a objetos, ya que le permitirá ser más flexible mentalmente con la forma en que está estructurado su código.

Antonio Haley
fuente
2

Para agregar a las otras respuestas:

Porque el curso SICP (los videos están disponibles aquí ) es increíble: ¡te enseña Lisp y mucho más !

OysterD
fuente
2

¿Aplicación asesina? Franz Inc. tiene una larga lista de historias de éxito , pero esta lista solo incluye a los usuarios de AllegroCL ... Probablemente haya otros. Mi favorita es la historia de Naughty Dog , ya que era un gran fanático de los juegos de Crash Bandicoot.

Para aprender Common Lisp, recomendaría Practical Common Lisp . Tiene un enfoque práctico que, al menos para mí, lo hizo más fácil que otros libros que he visto.

Vetle
fuente
2

Puede usar Clojure hoy para escribir pruebas y scripts en la parte superior de la máquina virtual Java. Si bien hay otros lenguajes Lisp implementados en la JVM, creo que Clojure hace el mejor trabajo de integración con Java.

Hay momentos en que el lenguaje Java se interpone en el camino de escribir pruebas para código Java (incluida la "programación comercial tradicional"). (No me refiero a eso como una acusación de Java, otros lenguajes sufren el mismo problema, pero es un hecho. Dado que el tema, no Java, no lo elaboraré. Por favor, siéntase libre de comenzar un nuevo tema si alguien quiere discutirlo.) Clojure elimina muchos de esos obstáculos.

Bill Smith
fuente
2

Lisp puede usarse en cualquier lugar donde use la programación tradicional. No es tan diferente, simplemente es más poderoso. ¿Escribir una aplicación web? puedes hacerlo en Lisp, escribiendo una aplicación de escritorio? puede hacerlo en Lisp, lo que sea, probablemente pueda hacerlo en Lisp, Python o cualquier otra programación genérica (hay algunos lenguajes que son adecuados para una sola tarea).

El mayor obstáculo probablemente será la aceptación de su jefe, sus compañeros o sus clientes. Eso es algo que tendrá que trabajar con ellos. La elección de una solución pragmática como Clojure que pueda aprovechar la base de instalación actual de la infraestructura Java, desde la JVM hasta las bibliotecas, podría ayudarlo. Además, si tiene un programa Java, puede hacer una arquitectura de complemento y escribir complementos de Clojure para él y terminar escribiendo la mitad de su código en Clojure.

Pablo
fuente
1

No es una razón, pero (trivial) AutoCAD tiene soporte de tiempo de ejecución LISP y DCL. Es una forma conveniente de escribir macros complejas (incluida la automatización ActiveX) si no desea usar VBA o sus SDK de C ++ o .NET, o si una expresión DIESEL no lo corta.

Muchas de las funciones de AutoCAD son en realidad rutinas LISP.

CAD bloke
fuente
1

Este es un tema que yo mismo he reflexionado durante un tiempo, pero realmente no he tomado una decisión, ya que el problema principal es el tiempo habitual ...;)

Y como no puedo encontrar estos enlaces en esta publicación, los agrego para interés público:

Historia de éxito y fracaso: listado en JPL

Historia de éxito realmente impresionante: Lisp en uso en la corporación Orbitz

Comparación y análisis de si usar Lisp en lugar de Java: Lisp como alternativa a Java

PPS
fuente
0

¡La sintaxis es irrelevante, la legibilidad no lo es!

kokos
fuente
0

¿Aplicación asesina? El motor de búsqueda de vuelos de ITA Software es uno.

En cuanto a "por qué", lo más probable es que lo convierta en un mejor desarrollador y es extremadamente improbable que lo haga peor. Sin embargo, puede hacer que prefiera dialectos lisp a otros idiomas.

Vatine
fuente