2011-03-20 10 views
56

Nota: No estoy preguntando qué aprender, cuál es mejor, o algo por el estilo.¿Cuáles son las diferencias reales entre Scheme y Common Lisp? (O cualquier otro dos dialectos de Lisp)

Recogí la versión gratuita de SICP porque sentí que sería agradable de leer (he oído cosas buenas al respecto, y estoy interesado en ese tipo de lado de la programación).

Sé que Scheme es un dialecto de Lisp y me pregunté: ¿cuál es la diferencia real entre Scheme y, por ejemplo, Common Lisp?

Parece que hay mucho sobre 'CL tiene un stdlib más grande ... El esquema no es bueno para la programación del mundo real ..' pero no hay nada que diga 'esto es porque CL es esto/tiene esto'.

+4

"El esquema no es bueno para la programación del mundo real" ... Hago programación en el mundo real en Scheme (vale, no mucho). – knivil

+0

No estoy seguro si este es el subtexto, pero recomendaría simplemente hacer los ejercicios SICP en Scheme. Puede utilizar casi cualquier implementación con los parámetros correctos porque el subconjunto en el que se enfoca es muy pequeño. Solo necesita encontrar los parámetros correctos para su elección, por ejemplo, en Racket probablemente sea el modo R5RS. Muchas ideas de SICP te ayudarán en tu estudio de Lisp adicional, incluso si usas Common Lisp o incluso Clojure en su lugar. – spacemanaki

+10

La última vez que vi, la especificación Scheme era de aproximadamente 50 páginas, y la especificación CL era superior a 1000. Por lo tanto, solo abra la especificación CL en cualquier página, y es probable que eso esté en CL pero no en Scheme. :-) – Ken

Respuesta

74

Esta es una pregunta algo complicada, ya que las diferencias son a la vez técnicas y (más importante aún, en mi opinión) culturales. Una respuesta solo puede proporcionar una visión subjetiva e imprecisa. Esto es lo que voy a ofrecer aquí. Para obtener detalles técnicos sin formato, consulte Scheme Wiki.

El esquema es un lenguaje basado en el principio de proporcionar un sustrato de lenguaje de base elegante, consistente y bien pensado sobre el que se pueden construir tanto los lenguajes de aplicación académicos como prácticos.

Rara vez encontrará a alguien que escriba una aplicación en el esquema puro R5RS (o R6RS), y debido al estándar minimalista, la mayoría del código no es portátil en las implementaciones de Scheme. Esto significa que tendrá que elegir cuidadosamente la implementación de su Esquema, en caso de que desee escribir algún tipo de aplicación para el usuario final, ya que la elección determinará en gran medida qué bibliotecas están disponibles para usted. Por otro lado, la relativa libertad en el diseño del lenguaje de aplicación real significa que las implementaciones de Scheme a menudo ofrecen características desconocidas en otros lugares; PLT Racket, por ejemplo, le permite utilizar el tipado estático y proporciona un IDE muy sensible al lenguaje.

La interoperabilidad más allá del lenguaje base se proporciona a través del proceso SRFI impulsado por la comunidad, pero la disponibilidad de cualquier SRFI determinada varía según la implementación.

La mayoría de los dialectos y bibliotecas de Scheme se centran en los modismos funcionales de programación, como la recursividad en lugar de la iteración. Hay varios sistemas de objetos que puede cargar como bibliotecas cuando quiere hacer OOP, pero la integración con el código existente depende en gran medida del dialecto Scheme y su cultura (Chicken Scheme parece estar más orientado a objetos que Racket, por ejemplo).

La programación interactiva es otro punto en el que difieren las subcomunidades de Scheme. MIT Scheme es conocido por su fuerte compatibilidad con la interactividad, mientras que PLT Racket se siente mucho más estático. En cualquier caso, la programación interactiva no parece ser una preocupación central para la mayoría de las subcomunidades de Scheme, y aún no he visto un entorno de programación similarmente interactivo como la mayoría de Common Lisps '.

Common Lisp es un lenguaje desgastado diseñado para una programación práctica. Está lleno de verrugas feas y hacks de compatibilidad, todo lo contrario al elegante minimalismo de Scheme. Pero también es mucho más funcional cuando se toma por sí mismo.

Common Lisp ha creado un ecosistema relativamente grande de bibliotecas portátiles. Por lo general, puede cambiar las implementaciones en cualquier momento, incluso después de la implementación de la aplicación, sin demasiados problemas. En general, Common Lisp es mucho más uniforme que Scheme, y los experimentos de lenguaje más radicales, si se hacen en absoluto, generalmente se incrustan como una biblioteca portátil en lugar de definir un dialecto de lenguaje completamente nuevo. Debido a esto, las extensiones de lenguaje tienden a ser más conservadoras, pero también más combinables (y, a menudo, opcionales).

Las extensiones de lenguaje universalmente útiles, como las interfaces de funciones foráneas, no se desarrollan a través de medios formales, sino que se basan en bibliotecas casi estándar disponibles en todas las implementaciones de Common Lisp.

Las expresiones idiomáticas son una mezcla salvaje de enfoques funcionales, imperativos y orientados a objetos, y en general, Common Lisp se siente más como un lenguaje imperativo que funcional. También es extremadamente dinámico, posiblemente más que cualquiera de los populares lenguajes de scripts dinámicos (la redefinición de clases se aplica a instancias existentes, por ejemplo, y el sistema de manejo de condiciones tiene incorporada la interactividad), y la programación interactiva y exploratoria es una parte importante de "La forma de Common Lisp". Esto también se refleja en los entornos de programación disponibles para Common Lisp, prácticamente todos ofrecen algún tipo de interacción directa con el compilador Lisp en ejecución. Common Lisp presenta un sistema de objetos integrado (CLOS), un sistema de manejo de condiciones significativamente más poderoso que la mera gestión de excepciones, parchabilidad en tiempo de ejecución y diversos tipos de estructuras de datos y utilidades integradas (incluyendo el notorio LOOP macro, un sublenguaje de iteración demasiado feo para Scheme pero demasiado útil como para no mencionarlo, así como un mecanismo de formateo tipo printf con GOTO support en cadenas de formato).

Tanto por el desarrollo interactivo basado en imágenes como por el lenguaje más extenso, las implementaciones de Lisp suelen ser menos portátiles en todos los sistemas operativos que las implementaciones de Scheme. Hacer que un Lisp Común se ejecute en un dispositivo incrustado no es para corazones débiles, por ejemplo. Al igual que Java Virtual Machine, también tiende a encontrar problemas en máquinas donde la memoria virtual está restringida (como los servidores virtuales basados ​​en OpenVZ). Las implementaciones de esquemas, por otro lado, tienden a ser más compactas y portátiles. La creciente calidad de la implementación de ECL ha mitigado un poco este punto, aunque su esencia sigue siendo cierta.

Si se preocupa por el soporte comercial, hay un par de compañías que ofrecen sus propias implementaciones de Common Lisp, que incluyen constructores gráficos de GUI, sistemas de bases de datos especializados, etcétera.

Resumiendo, Scheme es un lenguaje de diseño más elegante. Es principalmente un lenguaje funcional con algunas características dinámicas. Sus implementaciones representan varios dialectos incompatibles con características distintivas. Common Lisp es un lenguaje completamente desarrollado, altamente dinámico y multi-paradigma con varias características feas pero pragmáticas, cuyas implementaciones son ampliamente compatibles entre sí. Los dialectos de esquema tienden a ser más estáticos y menos interactivos que Common Lisp; Las implementaciones de Common Lisp tienden a ser más pesadas y más difíciles de instalar.

¡Cualquiera que sea el idioma que elijas, te deseo mucha diversión! :)

+3

'si desea escribir algún tipo de aplicación de usuario final' +1 – kmoe

2

esquema:

  • originalmente muy pocas especificaciones (nueva R7RS parece ser más pesado)
  • debido a la sintaxis sencilla, el esquema se puede aprender rápidamente
  • implementaciones proporcionan funciones adicionales, pero los nombres pueden diferir en diferentes implementaciones

Common Lisp:

  • muchas funciones están definidas por la especificación grande
  • diferente espacio de nombres de funciones y variables (lisp-2)

que son algunos puntos, seguro que hay muchos más, lo que no recuerdo en este momento .

+1

Usted se refiere a "RSR7"; esto debería ser "R6RS". –

+1

editado a R7RS. Tenía en mente el nuevo estándar planificado – Moe

5

Esa es una pregunta difícil de responder imparcialmente, especialmente porque muchos de los LISP clasificarían Scheme como LISP.

Josh Bloch (y esta analogía puede no ser su invención) describe que elegir un idioma es similar a elegir un pub local. En esa luz, entonces:

El pub "Scheme" tiene muchos investigadores de lenguajes de programación. Estas personas dedican mucha atención al significado del idioma, a mantenerlo bien definido y simple, y a discutir nuevas características innovadoras. Todos tienen su propia versión del lenguaje, diseñada para permitirles explorar su propia esquina particular de lenguajes de programación. A la gente del Scheme realmente le gusta la sintaxis entre paréntesis que tomaron de LISP; es flexible, liviano y uniforme y elimina muchas barreras a la extensión de idioma.

¿El pub "LISP"? Bueno ... No debería comentar; No he pasado suficiente tiempo allí :).

15

Algunas diferencias prácticas básicas:

  • Common Lisp tiene alcances separados para las variables y funciones; mientras que en Scheme solo hay un ámbito: las funciones son valores y definir una función con un nombre determinado es simplemente definir una variable configurada en lambda. Como resultado, en Scheme puede usar un nombre de función como variable y almacenarlo o pasarlo a otras funciones, y luego realizar una llamada con esa variable como si fuera una función. Pero en Common Lisp, es necesario convertir explícitamente una función en un valor mediante (function ...), y explícitamente llamar a una función almacenada en un valor mediante (funcall ...)
  • En Common Lisp, nil (la lista vacía) se considera falsa (por ejemplo, en if) y es el único valor falso. En Scheme, la lista vacía se considera verdadera y (la distinta) #f es el único valor falso
Cuestiones relacionadas