¿Lisp todavía tiene alguna característica especial que NO haya sido adoptada por otros lenguajes de programación?
Por Lisp, me refiero a todos los lenguajes de programación de Lisp en su conjunto. Me han dicho lo increíble que es Lisp y sé que muchos idiomas han sido inspirados por Lisp. ¿Pero Lisp todavía tiene alguna característica de diseño exclusiva que simplemente no se puede hacer en ningún otro idioma?
La razón por la que hice la pregunta es que recientemente, como programador aficionado, comencé a aprender Clojure solo por diversión, y el resultado es que encontré muchas publicaciones y comentarios relacionados con Lisp, diciendo una sola cosa: "Lisp es único ", pero otros lenguajes de programación modernos ya han adoptado y robado muchas ideas de Lisp, como los condicionales, la recursión y la función como ciudadano de primera clase. E incluso la metaprogramación puede ser realizada por muchos idiomas.
¿Me perdí algo y "Lisp sigue siendo diferente"?
O tengo suerte porque otros idiomas modernos han robado todas las partes buenas de Lisp, por lo que no es necesario profundizar en el mundo de Lisp entre paréntesis , y "Lisp era diferente".
Respuestas:
Una referencia canónica para este tipo de preguntas es What Grays Lisp Different, de Paul Graham . Las dos características clave restantes de Lisp que no están ampliamente disponibles, según este artículo en el momento de su redacción, son:
El comentario aborda cada punto y nombra los idiomas populares donde está disponible esa función.
Tenga en cuenta que este artículo fue revisado por última vez en 2002, y en los últimos 11 años ha habido una gran variedad de nuevos idiomas, algunos de los cuales pueden incorporar todas estas características de Lisp en su diseño.
fuente
eval
o similares, y muchos pueden hacer metaprogramación, por ejemplo, Haskell's Template Haskell. Lo (posiblemente) único de Lisp es que la representación de datos, código y metacódigo es la misma, no solo en sintaxis, sino que realmente es lo mismo.La pregunta es difícil de responder, ya que alguien tendría que saber todos los idiomas para saber que ningún otro tiene una característica particular disponible en Lisp, por lo que lo siguiente se basa en los idiomas con los que tengo experiencia.
Fuera de mi cabeza, las condiciones son algo que no he visto en ningún otro idioma. Piense en 'excepciones', pero donde la pila de llamadas no se desenrolla y donde la persona que llama puede enviar un valor de recuperación al sitio de excepción, pero sin perturbar la pila de llamadas entre el controlador y la fuente de la excepción. Para ser justos, esto es realmente solo una aplicación especial de continuaciones, por lo que Ruby y Scheme (al menos) pueden hacer esto.
El sistema macro de Lisp se beneficia de la regularidad / homoiconicidad, pero Scala planea incorporarlos como una característica estable en 2.12 y Template Haskell afirma características similares. Yo diría que serán más sintácticamente complejos que con Lisp, pero la generación de código en tiempo de compilación está ahí independientemente.
Ahora que lo pienso, sin embargo, la construcción directa de formularios es solo un tipo de macro disponible en Lisp: no he visto un equivalente de macros compiladoras o lectoras en ningún otro lugar.
La capacidad de algunos dialectos (por ejemplo, SBCL ) para guardar una imagen de proceso completa y reanudable es genial, pero de nuevo no es única: Smalltalk ha estado haciendo eso durante décadas.
Muchos otros lenguajes permiten la asignación de la desestructuración cuando se devuelven las matrices, pero el enfoque # 'valores y #' de valores múltiples enlazados / let-valores todavía parece ser específico para Common Lisp and Scheme (que todavía puede hacer una desestructuración 'regular' también ) El 'wantarray' de Perl permite que una función determine si se llama en un contexto escalar, de lista o vacío para que pueda ajustar su valor de retorno de una manera similar (-ish), pero no he visto valores de retorno múltiples 'verdaderos' fuera del esquema / CL.
En términos de características del lenguaje, probablemente no hay mucho que Lisp pueda hacer que otros idiomas no puedan hacer (la integridad de Turing es lo que es). Lo que es , sin embargo, es un lenguaje donde el código se expresa en términos de sus propias estructuras de datos, por lo que la idea grande ™ -que código está datos en algo que es relativamente fácil de trabajar.
fuente
Después de tantas décadas, no creo que haya nada exclusivo para Lisp. Pero incluso hoy, hay muchas cosas interesantes que son difíciles de encontrar fuera de Lisps. Algunas cosas que me vienen a la mente:
Finalmente, hay mucho más que aprender de Lisp que no se trata del lenguaje en sí, sino que se convirtió en parte de la historia de Lisp y se perdió en el tiempo. Por ejemplo, Interlisp, Symbolics Genera, etc ... si nunca pones las manos en Genera, mira este hilo de comp.lang.lisp donde Kent Pitman describe cómo "Emacs es solo una pálida sombra de los Zmacs de Genera", todo lo cual fue habilitado por teniendo un poderoso sistema Lisp del que Zmacs era parte, que se ejecutaba en una máquina Lisp.
fuente
No es necesariamente una característica única determinada . Es todo el aspecto, y cómo ciertos conjuntos de características funcionan juntas.
JavaScript o Java tienen muchas características de Lisp (máquina virtual, compilador / evaluador, recolección de basura, etc.). Pero JavaScript, por ejemplo, carece de la parte de programación simbólica, carece de capacidades matemáticas (internamente solo tiene flotantes), carece del manejo de errores, etc.
Muchos sistemas Common Lisp están optimizados para una forma de desarrollo en la que uno extiende el nuevo software de forma incremental, al extender el lenguaje Lisp en varias dimensiones utilizando diversas técnicas de metaprogramación, sin reiniciar el software durante mucho tiempo. Por lo tanto, debe ser flexible y extensible, pero al mismo tiempo debe ser robusto. Cambiar el idioma (las macros son básicamente una forma para que el usuario extienda el compilador) sin bloquear el programa.
Ahora, algo como JavaScript también se usa para extender un programa, generalmente un navegador web. Pero la mayoría de las veces no se hace mucha meta-programación en JavaScript, además de algún hacker de OOP .
Ejemplo:
Uno puede implementar un software matemático avanzado general para el dominio del álgebra computacional en su mayoría de dos maneras: escribir el motor en C con un lenguaje especializado en la parte superior (como Mathematica ) o en algún dialecto Lisp más avanzado. Macsyma / Maxima en Common Lisp, Reducir en Standard Lisp, Axiom en Common Lisp.
(También hay uno o más escritos en Python).
No hay muchos sistemas que ofrezcan el conjunto de características de algo como Axiom , que se ejecuta sobre Common Lisp.
Lo que hizo a Lisp atractivo para este tipo de aplicaciones es una combinación de características: matemáticas básicas avanzadas (bignums, proporciones, ...), computación simbólica, compilador interactivo, etc. Es muy posible obtener estas cosas al implementarlas en un nivel bajo. Nivel de lenguaje. De esa manera, uno habrá implementado el 50% o más de un sistema Lisp típico.
fuente
No hasta donde yo sé. Forth es fácilmente tan dinámico como Lisp, quizás más porque el código dinámico en Forth parece un código Forth normal, mientras que las macros Lisp tienden a usar características diferentes que el código Lisp normal (en Clojure, al menos, nunca he usado comillas de sintaxis fuera de una macro) y Como resultado, se ven muy diferentes del código normal de Lisp. Como ejemplo de cuán dinámico es Forth, aquí hay una manera de implementar comentarios en Forth :
fuente
Lisp tiene muchos dialectos, y cada uno de ellos tiene su propio conjunto de características. Mi característica favorita que es poco probable que sea adoptada por otro idioma es el "spaghetti stack" de Interlisp .
La pila de espagueti es como un cierre, pero con esteroides. Guarda no solo la función actual, sino todo el contexto hasta la parte superior de la pila. Algo así como una co-rutina , excepto que podría crearlos arbitrariamente, lo que da como resultado una jerarquía de contextos de pila.
fuente