¿Cuáles son las diferencias reales entre Scheme y Common Lisp?(O cualquier otro dialecto de Lisp)
common-lisp racket (4)
Algunas diferencias prácticas básicas:
- Common Lisp tiene ámbitos separados para 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, necesita convertir explícitamente una función en un valor usando
(function ...)
y llamar explícitamente una función almacenada en un valor usando(funcall ...)
- En Common Lisp,
nil
(la lista vacía) se considera falsa (por ejemplo, enif
), y es el único valor falso. En Scheme, la lista vacía se considera verdadera y (la distinta)#f
es el único valor falso
Nota: No estoy preguntando qué aprender, qué es mejor, ni nada de eso.
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''.
Esa es una pregunta difícil de responder con imparcialidad, especialmente porque muchos de los miembros de 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 para la extensión del idioma.
¿El pub "LISP"? Bueno ... No debería comentar; No he pasado suficiente tiempo allí :).
Esta es una pregunta algo difícil, 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 .
Scheme es un lenguaje construido sobre el principio de proporcionar un sustrato de lenguaje de base elegante, consistente y bien pensado sobre el cual se pueden construir tanto los lenguajes de aplicación prácticos como académicos.
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 del Esquema. 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 recursión 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 las subcomunidades de Scheme difieren. El Esquema MIT 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 usado en la batalla diseñado para la 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 criado 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 extranjeras, no se desarrollan a través de medios formales, sino que se basan en bibliotecas casi estándar disponibles en todas las principales implementaciones de Common Lisp.
Los idiomas idiomáticos 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 como uno 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 el mero manejo de excepciones, parchabilidad en tiempo de ejecución y varios tipos de estructuras de datos y utilidades incorporadas (incluida la notoria macro LOOP , una iteración sublenguaje demasiado feo para Scheme pero demasiado útil como para no mencionarlo, así como un mecanismo de formateo tipo printf con soporte de GOTO en cadenas de formato).
Tanto por el desarrollo interactivo basado en imágenes como por el lenguaje más amplio, las implementaciones de Lisp son 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 le interesa 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.
En resumen , 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 totalmente desarrollado, altamente dinámico, 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! :)
esquema:
- originalmente muy pocas especificaciones (el nuevo R7RS parece ser más pesado)
- debido a la sintaxis fácil, el esquema se puede aprender rápidamente
- las implementaciones proporcionan funciones adicionales, pero los nombres pueden diferir en las diferentes implementaciones
ceceo común:
- muchas funciones están definidas por la especificación más grande
- espacio de nombres diferente para funciones y variables (lisp-2)
esos son algunos puntos, seguro que hay muchos más, que no recuerdo en este momento.