2012-06-16 7 views
11

Estoy aprendiendo el esquema y hasta ahora he estado usando astucia. Realmente solo estoy aprendiendo como una forma de enseñarme un lenguaje de programación funcional, pero me gustaría publicar un proyecto de código abierto de algún tipo para reforzar el estudio, no estoy seguro de qué aún ... Soy un desarrollador web, entonces probablemente algo webby.Escribir código de esquema portátil. ¿Hay algo "estándar" más allá del R5RS mismo?

Es cada vez más evidente que la publicación de código de esquema no es muy fácil de hacer, con todas estas diferentes implementaciones y no hay normas reales más allá del núcleo del lenguaje mismo (R5RS). Por ejemplo, estoy casi seguro que va a tener que hacer IO básica en el disco y sobre un socket TCP, junto con la manipulación de cadenas, como el escaneo/expresiones regulares, que parece no estar cubierto por R5RS, a no ser que yo no estoy viendo en el documento. Parece que Scheme es más un "concepto" que un lenguaje práctico ... ¿es esta una evaluación justa? Tal vez debería buscar algo así como Haskell si quiero aprender un lenguaje de programación funcional que se preste más para usar en proyectos de código abierto.

En realidad, la cantidad de dolor no plantean las implementaciones diferentes del esquema cuando se desea publicar un proyecto de código abierto? Realmente no me gusta tener que mantener 5 funciones diferentes para cosas básicas como la manipulación de cadenas en varias implementaciones convencionales (Chicken, Guile, MIT, DrRacket). ¿Cuántas personas escriben el esquema para la compatibilidad de implementación cruzada, en lugar de estar estrechamente vinculado con las funciones de la biblioteca que solo existen en su propio esquema?

He leído http://www.ccs.neu.edu/home/dorai/scmxlate/scheme-boston/talk.html, que no me llene de confianza;)

editar | Vamos a redefinir "estándar" como "común".

+5

Su pregunta hace pensar que R5RS es el estándar más reciente para Scheme, pero ese no es el caso. R6RS, que maneja más de lo que usted pregunta, fue publicado en 2009 y es el estándar actual del Esquema R6RS aún es demasiado pequeño para hacer muchas cosas, por lo que probablemente quiera seguir con una implementación particular. Uso (y desarrollo) Racket, pero Guile también es una opción razonable. –

Respuesta

9

pregunta difícil.

mayoría de las personas deciden ser pragmático. Si la portabilidad entre las implementaciones es importante, escriben la mayor parte del programa en el Esquema estándar y aíslan las partes no estándar en las bibliotecas (pequeñas). Ha habido varios enfoques sobre cómo hacer esto exactamente. Un esfuerzo reciente es SnowFort.

http://snow.iro.umontreal.ca/

Un esfuerzo más es SLIB.

http://people.csail.mit.edu/jaffer/SLIB

Si nos fijamos - o solicita - bibliotecas de expresiones regulares y lexer/analizadores que da gusto encontrar algunos.

Dado que la filosofía de R5RS es incluir solo aquellas características de lenguaje que todos los implementadores acuerden, el estándar es pequeño, pero también muy estable.

Sin embargo, para la programación del "mundo real", R5RS podría no ser el más adecuado. Por lo tanto, R6RS (¿y R7RS?) Incluyen más bibliotecas del "mundo real".

Dicho esto si sólo se necesita la portabilidad, ya que parece ser lo correcto, entonces reconsiderar cuidadosamente si realmente quiere poner el esfuerzo. Me limitaré a escribir mi programa sobre la aplicación Sé el mejor. Luego, si es necesario, póngalo después. Esto a menudo resulta ser más fácil de lo esperado.

+0

Excelente respuesta, gracias. Lo mantendré abierto por un tiempo más. Una de las razones por las que uso Guile es porque no requiere Java y está escrito en C (no tengo una JVM y no quiero instalar una). Lamentablemente, no creo que Guile tenga una versión compatible con R6RS, y MIT-Scheme ha dicho que no tienen la intención de escribir una. El pollo sigue siendo R5RS. Puede que tenga que buscar un poco otras implementaciones de C que tengan R6RS :) – d11wtq

+0

La nieve parece interesante. Algo así como Rubygems o NPM, por el sonido de eso. – d11wtq

+1

La nieve es para código portátil. Ver también http://planet.racket-lang.org y http://wiki.call-cc.org/chicken-projects/egg-index-4.html para más paquetes. Aunque los paquetes están en la página Racket o Chicken, hay algunos paquetes portátiles en el medio. Desafortunadamente, debes mirar la fuente para averiguarlo. – soegaard

8

Escribo un blog que usa Scheme como su lenguaje de implementación. Porque yo no quiero alejar a los usuarios de cualquier implementación particular del Esquema, escribo en un dialecto restringido del esquema que se basa en R5RS más macros sintaxis de los casos más mi Standard Prelude.No creo que sea excesivamente restrictivo para el tipo de programas algorítmicos que escribo, pero sus necesidades pueden ser diferentes. Si miras los diversos ejercicios en el blog, verás que escribí mi propia herramienta de reproducción de expresiones regulares, que hice bastante manipulación de cadenas y que arrebaté archivos de Internet al desgranar wget (Yo uso Chez Scheme: los usuarios tienen que proporcionar su propio mecanismo de shell no portátil si usan algo más); Incluso he hecho algunos trabajos de gráficos limitados escribiendo secuencias de terminales ANSI.

Discreparé un poco con Jens. En lugar de portar después, me resulta más fácil construir en portabilidad desde el principio. No solía pensar de esa manera, pero mi experiencia en los últimos tres años muestra que funciona.

+0

Blog interesante. Tendremos que vigilarlo. ¿Quiere decir que el blog está escrito en Scheme, o es WordPress? o_O – d11wtq

+0

El blog es WordPress. Las soluciones se implementan en Scheme. – user448810

+0

LOL al principio pensé que estaba literalmente escrito en Scheme =) – petajamaja

15

creo que en el esquema, la portabilidad es una tarea de tontos, ya que las implementaciones de Scheme son más diferentes de lo que son similares, y no hay una sola aplicación que otras implementaciones tratan de emular (a diferencia de Python y Ruby, por ejemplo) .

Por lo tanto, la portabilidad en Scheme es análoga a la utilización de la representación de software para escribir juegos "porque está en el subconjunto común entre OpenGL y DirectX". En otras palabras, es un mínimo común denominador: se puede hacer, pero se pierde el acceso a muchas características que ofrece la implementación.

Por esta razón, mientras SRFIs generalmente tienen una implementación de referencia portátil (cuando sea posible), algunos de ellos están acompañados de notas que una aplicación Esquema de calidad debe adaptar la biblioteca para usar las características específicas de la implementación con el fin de funcionar de manera óptima.

  • Un buen ejemplo es case-lambda (SRFI 16); puede implementarse de forma portátil, y la implementación de referencia lo demuestra, pero es definitivamente menos óptimo en comparación con un case-lambda integrado, ya que tiene que implementar el despacho de función en el código de "usuario".
  • Otro ejemplo es stream-constant de SRFI 41. La implementación de referencia usa una simulación O (n) de listas circulares para la portabilidad, pero cualquier implementación decente debería adaptar esa función para usar listas circulares reales para que sea O (1).

La lista continúa. Muchas cosas útiles en Scheme no son portátiles: las SRFI ayudan a que más características sean portátiles, pero no hay forma de que las SRFI puedan cubrirlo todo. Si desea realizar un trabajo útil de manera eficiente, es probable que tenga que utilizar funciones no portátiles. Lo mejor que puede hacer, creo, es escribir una fachada para encapsular aquellas características que no están ya cubiertas por los SRFI.

En realidad, now a way to implement stream-constant in an O(1) fashion no tiene listas circulares. Portátil y rápido para la victoria!

6

Vale la pena señalar que las implementaciones modernas de Scheme son bastante portátiles; a menudo puede exportar programas completos a entornos nuevos simplemente llevando el Esquema apropiado. Sin embargo, eso no ayuda mucho a los programadores de bibliotecas, y ahí es donde interviene R7RS-small, la última definición de Scheme. Todavía no se ha implementado ampliamente, pero proporciona un núcleo común más grande que R5RS.

+0

¿R7RS-small proporciona un núcleo común más grande que R7RS? Seguramente quisiste decir R5RS. :-D –

+1

Sí, por supuesto. Fijo. –

Cuestiones relacionadas