2011-01-03 8 views
6

Estoy bastante intrigado por Gambit Scheme, en particular por su amplia gama de plataformas compatibles, y su capacidad de poner código C en su fuente Scheme cuando sea necesario. Dicho esto, es un Scheme, que tiene menos "baterías incluidas" en comparación con Common Lisp. A algunas personas les gusta codificar muchas cosas desde cero, (por ejemplo, un vigoroso afeitado de yak) ¡pero yo no!Comparando Common Lisp con Gambit w.r.t su biblioteca de acceso y sistemas de objetos

Esto me lleva a mis dos preguntas, orientado a las personas que han utilizado tanto Gambito y un poco de sabor de Common Lisp:

1) ¿Qué eficacia tiene un mejor acceso a las bibliotecas? Scheme tiene menos bibliotecas que Common Lisp. Sin embargo, Gambit Scheme tiene un acceso más fluido a las bibliotecas del código C/C++ &, que superan con creces las bibliotecas de Common Lisp. En su opinión, ¿la suavidad de la FFI de Gambit es mayor que la falta de bibliotecas nativas?

2) ¿Cómo se comparan los sistemas objeto de Scheme (por ejemplo, TinyCLOS, Meroon) con el CLOS de Common Lisp? Si los encuentra faltos, ¿qué característica (s) extrañaste más? Finalmente, ¿qué tan importante es un sistema de objetos en Lisp/Scheme en primer lugar? He oído hablar de empresas completas basadas en lisp (por ejemplo, ITA Software) que renunciaron a CLOS por completo. ¿Los objetos son realmente tan opcionales en Lisp/Scheme? Me temo que si Gambit no tiene un buen sistema de objetos, puedo extrañarlos (mi experiencia en programación está orientada exclusivamente a objetos).

Gracias por ayudar a un aspirante a convertir de C++/Python,

- Matt

PD: Alguien con más de 1500 representante, ¿podría crear una etiqueta de "Gambit"? :) Gracias Jonas!

Respuesta

2

1) No he usado Gambit Scheme, así que realmente no puedo decir qué tan suave es la integración de C/C++. Pero todos los Common Lisps que he usado tienen C FFI completamente funcional. Entonces, la disponibilidad de las bibliotecas C es la misma. Se necesita un poco de trabajo para integrar, pero supongo que este también es el caso con Gambit Scheme. Después de todo, Lisp y C son idiomas diferentes ...? Pero tal vez tenga una experiencia diferente, me gustaría aprender más en ese caso.

Puede que le interese Quicklisp, un nuevo proyecto Common Lisp realmente bueno - hace que sea muy fácil instalar muchas bibliotecas de calidad.

2) C++ y Python están diseñados para usar OOP y clases como los medios típicos para encapsular y estructurar datos. CLOS no tiene esta ambición en absoluto. En cambio, proporciona funciones genéricas que pueden especializarse para ciertos tipos de argumentos, no necesariamente clases. Esencialmente, esto permite OOP, pero en Common Lisp, OOP es una característica conveniente en lugar de algo fundamental para hacer las cosas.

Creo que CLOS está mucho más bien diseñado y es más flexible que el modelo de objetos C++. TinyCLOS no debería ser diferente en ese aspecto.

+0

El problema con el mero hecho de tener una FFI es que le obliga a envolver cada función que se toca de Lisp. Incluso con la ayuda de SWIG, esto puede convertirse rápidamente en una tarea ardua. Gambit tiene la ventaja de permitirle insertar un bloque de código C (y C++!) Directamente en su fuente de esquema. En otras palabras, solo tiene que escribir el código de interfaz para cualquier dato que necesite pasar dentro y fuera de ese bloque, no para cada función en ese bloque. Esto es genial porque a menudo necesita usar un conjunto de funciones de C/C++ para producir el resultado que le interesa, y solo se preocupa por envolver el resultado. – SuperElectric

+0

@SuperElectric: Pero siempre se puede poner ese bloque de C (o C++) código en una función de C, y luego acceder a esta función a través de FFI. –

+0

@ MiklósHomolya Cierto, pero es una cuestión de conveniencia. A partir de mi experiencia con Lush, puedo decir que el poder sólo hay que poner algo de código C en el medio de un cuerpo fucntion Lisp y tiene que ser capaz de acceder a cualquier variable Lisp en su alcance es una gran victoria de la productividad. – SuperElectric

5

Sure Scheme en su conjunto tiene menos bibliotecas en el estándar definido, pero cualquier implementación de un Esquema dado usualmente se basa en ese estándar para incluir más tipo de funciones de "baterías incluidas".

Gambit, por ejemplo, utiliza el sistema de paquete Snow que le dará acceso a varias bibliotecas de soporte.

Otros esquemas les va aún mejor, teniendo acceso a más (o mejores) bibliotecas de soporte. Tanto Racket (con PlaneT) como Chicken (con eggs) inmediatamente vienen a la mente.

Dicho esto, el Common Lisp es muy rica y también un gran número de bibliotecas interesantes y útiles son un simple asdf-instalación de distancia.

En cuanto a los sistemas de objetos de Scheme, yo personalmente tienden a favorecer pollo Esquema y han llevado a favorecer coops. Dicho esto, no hay absolutamente nada de malo con TinyCLOS. O serviría bien y realmente no encontraría nada de lo que carezca. Aunque esa última afirmación podría tener más que ver con el hecho de que no tiendo a depender de muchos objetos orientados a ismos al escribir Scheme. Ambos sistemas en mi experiencia tienden a aparecer cuando quiero escribir "protocolos" y luego tengo una manera de especializarme en el protocolo, si eso tiene sentido.

+0

"Ambos sistemas en mi experiencia tienden a aparecer cuando quiero escribir" protocolos "y luego tengo una manera de especializarme en el protocolo, si eso tiene sentido". ... ermmm no realmente. ¿A qué sistemas se refiere y podría definir 'protocolo'? – SuperElectric

+0

los sistemas siendo los sistemas orientados a objetos que mencioné. El protocolo es un método genérico, y los objetos TinyCLOS (o cooperativas) luego proporcionan especializaciones de parámetros de tipo al método, de modo que se puede utilizar una interfaz similar para múltiples tipos. La mejor analogía que puedo pensar es un método de plantilla de C++, donde se puede especializar (proporcionar un comportamiento personalizado) en base al tipo de entrada. – Shaun

+0

Hay un capítulo en el libro Practical Common Lisp que hace un mejor trabajo que el de explicar. Se puede leer aquí: http://www.gigamonkeys.com/book/object-reorientation-generic-functions.html – Shaun