stringtranslate.com

Raqueta (lenguaje de programación)

Racket es un lenguaje de programación multiparadigma de propósito general . El lenguaje Racket es un dialecto moderno de Lisp y un descendiente de Scheme . Está diseñado como una plataforma para el diseño e implementación de lenguajes de programación. [9] Además del lenguaje central Racket, Racket también se usa para referirse a la familia de lenguajes de programación [10] y al conjunto de herramientas que respaldan el desarrollo en y con Racket. [11] Racket también se usa para scripting , educación en ciencias de la computación e investigación.

La plataforma Racket proporciona una implementación del lenguaje Racket (incluyendo un sistema de ejecución , [12] bibliotecas y un compilador que soporta varios modos de compilación: código máquina, independiente de la máquina, interpretado y JIT) junto con el entorno de desarrollo integrado (IDE) DrRacket escrito en Racket. [13] Racket es utilizado por el programa de extensión ProgramByDesign , que tiene como objetivo convertir la informática en "una parte indispensable del plan de estudios de artes liberales ". [14] [15]

El lenguaje central Racket es conocido por su extenso sistema de macros que permite crear lenguajes integrados y específicos de dominio , construcciones de lenguaje como clases o módulos y dialectos separados de Racket con semántica diferente . [16] [17] [18] [19]

La distribución de la plataforma es un software libre y de código abierto distribuido bajo las licencias Apache 2.0 y MIT . [20] Las extensiones y paquetes escritos por la comunidad pueden cargarse en el catálogo de paquetes de Racket .

Historia

Desarrollo

Matthias Felleisen fundó PLT Inc. a mediados de los años 1990, primero como un grupo de investigación, poco después como un proyecto dedicado a producir materiales pedagógicos para programadores novatos (conferencias, ejercicios/proyectos, software). En enero de 1995, el grupo decidió desarrollar un entorno de programación pedagógica basado en Scheme . Matthew Flatt improvisó MrEd, la máquina virtual original para Racket, a partir de libscheme, [21] wxWidgets y algunos otros sistemas libres. [22] En los años siguientes, un equipo que incluía a Flatt, Robby Findler , Shriram Krishnamurthi , Cormac Flanagan y muchos otros produjo DrScheme, un entorno de programación para programadores novatos de Scheme y un entorno de investigación para [tipos de sistema#Combinación de comprobación de tipos estática y dinámica|tipado gradual]]. [13] El principal lenguaje de desarrollo que admitía DrScheme se llamaba PLT Scheme.

Paralelamente, el equipo comenzó a realizar talleres para profesores de secundaria, capacitándolos en diseño de programas y programación funcional. Las pruebas de campo con estos profesores y sus alumnos brindaron pistas esenciales para orientar el desarrollo.

En los años siguientes, PLT agregó lenguajes de enseñanza, un programador algebraico, [23] un bucle de lectura-evaluación-impresión transparente , una impresora basada en constructores y muchas otras innovaciones a DrScheme, produciendo un entorno de desarrollo de programas pedagógicos de calidad de aplicación. En 2001, el equipo central (Felleisen, Findler, Flatt, Krishnamurthi) también había escrito y publicado su primer libro de texto, How to Design Programs , basado en su filosofía de enseñanza.

El Manifiesto Racket [9] detalla los principios que impulsan el desarrollo de Racket, presenta el marco de evaluación detrás del proceso de diseño y detalla oportunidades para futuras mejoras.

Historial de versiones

La primera generación de revisiones del esquema PLT introdujo características para la programación a gran escala con módulos y clases . La versión 42 introdujo unidades (un sistema de módulos de primera clase) para complementar las clases para el desarrollo a gran escala. [24] El sistema de clases ganó características (por ejemplo, interfaces de estilo Java ) y también perdió varias características (por ejemplo, herencia múltiple ) a lo largo de estas versiones. [16] El lenguaje evolucionó a lo largo de varias versiones sucesivas y ganó popularidad en la versión 53, lo que llevó a un trabajo extenso y a la siguiente versión 100, que sería equivalente a una versión "1.0" en los sistemas de versiones populares actuales.

La siguiente revisión importante se denominó Versión 200, que introdujo un nuevo sistema de módulos predeterminado que coopera con las macros. [24] En particular, el sistema de módulos garantiza que el cálculo en tiempo de ejecución y en tiempo de compilación estén separados para soportar una "torre de lenguajes". [25] A diferencia de las unidades, estos módulos no son objetos de primera clase .

La versión 300 introdujo soporte para Unicode , soporte para bibliotecas externas y mejoras en el sistema de clases. [24] Posteriormente, la serie 300 mejoró el rendimiento del entorno de ejecución del lenguaje con la incorporación de un compilador JIT y un cambio a una recolección de basura generacional predeterminada .

En la siguiente versión principal, el proyecto había cambiado a una numeración de versiones basada en secuencias más convencional . La versión 4.0 introdujo la #langabreviatura para especificar el lenguaje en el que está escrito un módulo. Además, la revisión introdujo pares y listas inmutables , compatibilidad con paralelismo de grano fino y un dialecto de tipado estático . [26]

El 7 de junio de 2010, PLT Scheme pasó a llamarse Racket. [27] El cambio de nombre coincidió con el lanzamiento de la versión 5.0. Posteriormente, la interfaz gráfica de usuario (GUI) se reescribió en Racket desde C++ en la versión 5.1 utilizando kits de herramientas de interfaz de usuario nativos en todas las plataformas. [22] La versión 5.2 incluía una herramienta de verificación de sintaxis en segundo plano , una nueva biblioteca de gráficos, una biblioteca de base de datos y un nuevo REPL extendido. [28] La versión 5.3 incluía una nueva función de submódulo para módulos cargados opcionalmente, [29] nuevas herramientas de optimización , una biblioteca JSON y otras funciones. [30] La versión 5.3.1 introdujo mejoras importantes en DrRacket: el verificador de sintaxis en segundo plano se activó de forma predeterminada y se agregó una nueva herramienta de vista previa de la documentación. [31]

En la versión 6.0, Racket lanzó su sistema de gestión de paquetes de segunda generación. Como parte de este desarrollo, el repositorio principal DrRacket y Racket se reorganizó y se dividió en un gran conjunto de paquetes pequeños, lo que hizo posible instalar un racket mínimo e instalar solo los paquetes necesarios. [32]

La versión 7 de Racket se lanzó con un nuevo expansor de macros escrito en Racket como parte de los preparativos para admitir la migración al sistema de ejecución Chez Scheme y admitir múltiples sistemas de ejecución. [33] [34] El 19 de noviembre de 2019, se lanzó Racket 7.5. La licencia de Racket 7.5 era menos restrictiva. Ahora usan la licencia Apache 2.0 o la licencia MIT. [35] [36]

El 13 de febrero de 2021 se lanzó Racket 8.0. Racket 8.0 marca el primer lanzamiento en el que Racket con el sistema de ejecución Chez Scheme , conocido como Racket CS, es la implementación predeterminada. Racket CS es más rápido, más fácil de mantener y desarrollar, compatible con versiones anteriores de los programas Racket existentes y tiene una mejor recolección de basura paralela. [37]

Características

El lenguaje principal de Racket incluye macros , módulos , cierres léxicos , llamadas de cola , continuaciones delimitadas , [38] parámetros (variables fluidas), contratos de software , [39] subprocesos verdes y subprocesos del SO , [40] [41] [42] y más. El lenguaje también viene con primitivos, como espacios de eventos y custodios, que controlan la gestión de recursos y permiten que el lenguaje actúe como un sistema operativo para cargar y administrar otros programas. [12] Se crean extensiones adicionales al lenguaje con el poderoso sistema de macros, que junto con el sistema de módulos y los analizadores personalizados pueden controlar todos los aspectos de un lenguaje. [43] La mayoría de las construcciones del lenguaje en Racket se implementan como macros en el lenguaje base. Estos incluyen un sistema de clases mixin , [16] un sistema de componentes (o módulos) tan expresivo como la atribución opaca en el sistema de módulos ML , [17] y coincidencia de patrones .

Además, el lenguaje presenta el primer sistema de contratos para un lenguaje de programación de orden superior . [44] El sistema de contratos de Racket está inspirado en el trabajo de Design by Contract para Eiffel y lo extiende para que funcione con valores de orden superior, como funciones de primera clase , objetos, celdas de referencia , etc. Por ejemplo, se puede garantizar que un objeto que se verifica mediante un contrato realice verificaciones de contrato cuando finalmente se invoquen sus métodos.

Racket incluye compiladores de bytecode y JIT (JIT). El compilador de bytecode produce un formato de bytecode interno que ejecuta la máquina virtual Racket , y el compilador JIT traduce el bytecode a código de máquina en tiempo de ejecución.

Desde 2004, el lenguaje también se distribuye con PLaneT, un administrador de paquetes que está integrado en el sistema de módulos para que las bibliotecas de terceros se puedan importar y usar de manera transparente. Además, PLaneT tiene una política de control de versiones incorporada para evitar el infierno de dependencias . [45]

A finales de 2014, gran parte del código de Racket se trasladó a un nuevo sistema de empaquetado independiente de la base de código principal. Este nuevo sistema de empaquetado es atendido por un programa cliente llamado raco . El nuevo sistema de empaquetado ofrece menos funciones que PLaneT; una publicación de blog de Jay McCarthy en el blog de Racket explica la razón del cambio y cómo duplicar el sistema anterior. [46]

Extensibilidad de lenguaje integrada y macros

Las características que distinguen más claramente a Racket de otros lenguajes de la familia Lisp son sus características integradas de extensibilidad del lenguaje que admiten la creación de nuevos lenguajes específicos de dominio y de propósito general . Las características de extensibilidad de Racket están integradas en el sistema de módulos para permitir un control sensible al contexto y a nivel de módulo sobre la sintaxis. [18] Por ejemplo, la #%appforma sintáctica se puede anular para cambiar la semántica de la función application . De manera similar, la #%module-beginforma permite un análisis estático arbitrario de todo el módulo. [18] Dado que cualquier módulo se puede utilizar como lenguaje, a través de la #langnotación, esto significa efectivamente que prácticamente cualquier aspecto del lenguaje se puede programar y controlar.

Las características de extensibilidad a nivel de módulo se combinan con un sistema de macros higiénico similar al de Scheme , que proporciona más funciones que el sistema de manipulación de expresiones s de Lisp , [47] [48] las macros de extensión de sintaxis higiénicas de Scheme 84 o las reglas de sintaxis de R5RS . De hecho, es justo decir que el sistema de macros es una interfaz de programación de aplicaciones (API) cuidadosamente ajustada para extensiones de compilador . Al utilizar esta API de compilador, los programadores pueden agregar funciones y lenguajes completos específicos del dominio de una manera que los hace completamente indistinguibles de las construcciones de lenguaje incorporadas.

El sistema de macros de Racket se ha utilizado para construir dialectos lingüísticos completos . Entre ellos se encuentran Typed Racket, que es un dialecto de Racket con tipado gradual que facilita la migración de código no tipado a tipado, [49] Lazy Racket, un dialecto con evaluación diferida , [50] y Hackett, que combina Haskell y Racket. [51] El lenguaje de programación pedagógico Pyret se implementó originalmente en Racket. [52] [53]

Otros dialectos incluyen FrTime ( programación reactiva funcional ), Scribble (lenguaje de documentación), [54] Slideshow ( lenguaje de presentación ), [55] y varios lenguajes para educación. [56] [57]

La distribución principal de Racket proporciona bibliotecas para ayudar al desarrollo de lenguajes de programación. [18] Dichos lenguajes no se limitan a la sintaxis basada en expresiones s . Además de las extensiones de sintaxis convencionales basadas en tablas de lectura, la directiva #langpermite la invocación de analizadores arbitrarios, que se pueden implementar utilizando la biblioteca de herramientas de análisis. [58] Consulte la programación lógica de Racket para ver un ejemplo de dicho lenguaje.

Entorno de programación

La plataforma de lenguaje proporciona un IDE autoalojado [13] llamado DrRacket, un servidor web basado en continuación , [59] una interfaz gráfica de usuario , [22] y otras herramientas. Como una herramienta de scripting viable con bibliotecas como lenguajes de scripting comunes , se puede utilizar para scripting del shell de Unix. Puede analizar argumentos de línea de comandos y ejecutar herramientas externas.

IDE de DrRacket

DrRacket (anteriormente DrScheme) se utiliza ampliamente en cursos introductorios de informática que enseñan Scheme o Racket y es elogiado por su simplicidad y atractivo para programadores principiantes. El IDE se creó originalmente para su uso con el proyecto TeachScheme! (ahora ProgramByDesign ), un esfuerzo de divulgación de la Northeastern University y varias universidades afiliadas para atraer a estudiantes de secundaria a cursos de informática a nivel universitario.

El editor permite resaltar errores de sintaxis y de tiempo de ejecución, emparejar paréntesis, un depurador y un programador algebraico. Sus características, que son fáciles de usar para los estudiantes, incluyen compatibilidad con múltiples "niveles de lenguaje" (estudiante principiante, estudiante intermedio, etc.). También cuenta con compatibilidad con bibliotecas integradas y herramientas de análisis sofisticadas para programadores avanzados. Además, la programación orientada a módulos es compatible con el navegador de módulos, una vista de contorno, pruebas integradas y mediciones de cobertura , y compatibilidad con refactorización . Proporciona acceso integrado y sensible al contexto a un extenso sistema de ayuda con hipervínculos llamado "Help Desk".

DrRacket está disponible para Windows , macOS , Unix y Linux con el sistema X Window y los programas se comportan de manera similar en todas estas plataformas.

Ejemplos de código

Aquí hay un programa trivial "¡Hola, mundo!" :

#lang racket "¡Hola, mundo!"

Al ejecutar este programa se produce el resultado:

"¡Hola Mundo!"

He aquí un programa un poco menos trivial:

El resultado de este programa, como se muestra en DrRacket
#lang racket ( requiere 2htdp/imagen ) ( sea sierpinski ([ n 8 ]) ( si ( cero? n ) ( triángulo 2 ' sólido ' rojo ) ( sea ([ t ( sierpinski ( - n 1 ))]) ( congelar ( encima de t ( al lado de t t ))))))                      

Este programa, tomado del sitio web Racket, dibuja un triángulo de Sierpinski , anidado a una profundidad de 8.

Con la #langdirectiva, se puede escribir un archivo fuente en diferentes dialectos de Racket. A continuación, se muestra un ejemplo del programa factorial en Typed Racket, un dialecto de Racket con tipado estático :

#lang tipeado/raqueta( : hecho ( Entero -> Entero )) ( define ( hecho n ) ( si ( cero? n ) 1 ( * n ( hecho ( - n 1 )))))                

Implementaciones

Actualmente, Racket tiene dos implementaciones. Ambas son compatibles con Linux, Windows y MacOS en una variedad de arquitecturas y son compatibles a partir de la versión 8.8 (2023). La implementación predeterminada utiliza el compilador incremental y el entorno de ejecución de Chez Scheme . La implementación alternativa genera un código de bytes independiente de la plataforma y utiliza la compilación Just-in-time para generar el código de máquina a medida que se carga. [60]

Además, existen implementaciones experimentales:

Aplicaciones y uso práctico

Además de tener una base en la teoría de lenguajes de programación , Racket fue diseñado como un lenguaje de propósito general para sistemas de producción. Por lo tanto, la distribución Racket cuenta con una amplia biblioteca que cubre la programación de sistemas y redes, el desarrollo web, [59] una interfaz uniforme con el sistema operativo subyacente, una interfaz de función externa dinámica , [63] varios tipos de expresiones regulares , generadores de analizador léxico/analizador, [58] programación lógica y un marco de interfaz gráfica de usuario completo .

Racket tiene varias características útiles para un lenguaje comercial, entre ellas la capacidad de compilar ejecutables independientes en Windows, macOS y Unix, un generador de perfiles y depurador incluidos en el entorno de desarrollo integrado (IDE) y un marco de pruebas unitarias .

Racket se ha utilizado para proyectos comerciales y aplicaciones web. Un ejemplo notable es el sitio web Hacker News , que se ejecuta en Arc , desarrollado en Racket. Naughty Dog lo ha utilizado como lenguaje de programación en varios videojuegos. [64]

Racket se utiliza para enseñar a los estudiantes álgebra a través del diseño de juegos en el programa Bootstrap . [65]

Referencias

  1. ^ "Racket v8.15". 5 de noviembre de 2024. Consultado el 7 de noviembre de 2024 .
  2. ^ Tobin-Hochstadt, Sam; Gerard, Sage; Dueck, Joel; Flatt, Matthew ; Software Freedom Conservancy ; Chestek, Pamela (15 de noviembre de 2019). "Completando el esfuerzo de renovación de licencias de Racket" . Consultado el 27 de diciembre de 2019 .
  3. ^ "Archivos DrRacket" . Consultado el 21 de julio de 2019 . La extensión de archivo estándar para un archivo de programa Racket es ".rkt". Las extensiones ".ss", ".scm" y ".sch" también son históricamente populares.
  4. ^ Strickland, TS; Fellesisen, Matthias (2010). "DLS 2010: Contratos para clases de primera clase" (PDF) .
  5. ^ Bonnaire-Sergeant, Ambrose (2012). Un sistema de tipos opcional práctico para Clojure (tesis). Universidad de Australia Occidental.
  6. ^ "Preguntas sobre Planet2".
  7. ^ "Bibliografía de Rust". GitHub . 23 de noviembre de 2022.
  8. ^ Sperber, Michael; Dybvig, R. Kent; Flatt, Matthew; Van Straaten, Anton; et al. (agosto de 2007). "Informe revisado6 sobre el esquema de lenguaje algorítmico (R6RS)". Comité directivo del esquema . Consultado el 13 de septiembre de 2011 .
  9. ^ ab Felleisen, M.; Findler, RB; Flatt, M.; Krishnamurthi, S.; Barzilay, E.; McCarthy, J.; Tobin-Hochstadt, S. (2015). "El manifiesto de la raqueta" (PDF) . Actas de la primera cumbre sobre avances en lenguajes de programación : 113–128.
  10. ^ "Dialectos de raqueta y esquema" . Consultado el 15 de agosto de 2011 .
  11. ^ "Bienvenido a Racket" . Consultado el 15 de mayo de 2019 .
  12. ^ ab Flatt; Findler; Krishnamurthi; Felleisen (1999). Lenguajes de programación como sistemas operativos (o, La venganza del hijo de la máquina Lisp) . Conferencia internacional sobre programación funcional.
  13. ^ abc Findler; Clements; Flanagan; Flatt; Krishnamurthi; Steckler; Felleisen (2001). "DrScheme: Un entorno de programación para Scheme" (PDF) . Revista de programación funcional .
  14. ^ Felleisen; Findler; Flatt; Krishnamurthi (2004). "El proyecto TeachScheme!: informática y programación para todos los estudiantes". Revista de educación en ciencias de la computación .
  15. ^ "Descripción general". Programa por diseño . Consultado el 17 de agosto de 2011 .
  16. ^ abc Flatt, M.; Findler, RB; Felleisen, M. (2006). "Scheme con clases, mixins y rasgos" (PDF) . Simposio asiático sobre lenguajes y sistemas de programación .
  17. ^ ab Flatt, M.; Felleisen, M. (1998). "Unidades: módulos interesantes para lenguajes de moda". Diseño e implementación de lenguajes de programación .
  18. ^ abcd Tobin-Hochstadt, S.; St-Amour, V.; Culpepper, R.; Flatt, M.; Felleisen, M. (2011). "Lenguajes como bibliotecas" (PDF) . Diseño e implementación de lenguajes de programación .
  19. ^ Felleisen, Matías; Findler, Robert Bruce; Flatt, Mateo; Krishnamurthi, Shriram; Barzilay, Eli; McCarthy, Jay; Tobin-Hochstadt, Sam (2018). "Un lenguaje de programación programable". Comunicaciones de la ACM . 61 (3): 62–71. doi :10.1145/3127323. S2CID  3887010.
  20. ^ "Racket: Licencia de software" . Consultado el 20 de octubre de 2015 .
  21. ^ Benson, Brent W. Jr. (26–28 de octubre de 1994). "libscheme: Scheme como biblioteca C". Escrito en Santa Fe, NM. Actas del Simposio USENIX sobre lenguajes de muy alto nivel . Berkeley, CA: Asociación USENIX. págs. 7–19. ISBN 978-1880446652. Recuperado el 7 de julio de 2013 .
  22. ^ abc "Reconstrucción de la capa gráfica de Racket". 2010-12-08 . Consultado el 2017-12-11 .
  23. ^ Clements, J.; Flatt, M.; Felleisen, M. (2001). "Modelado de un motor paso a paso algebraico" (PDF) . Simposio Europeo sobre Lenguajes de Programación .
  24. ^ abc "Notas de la versión de Racket Core". Archivado desde el original el 5 de julio de 2013. Consultado el 15 de abril de 2012 .
  25. ^ Flatt, M. (2002). "Macros componibles y compilables". Conferencia internacional sobre programación funcional .
  26. ^ "Esquema PLT versión 4.0". 12 de junio de 2008. Archivado desde el original el 2 de febrero de 2013. Consultado el 7 de agosto de 2012 .
  27. ^ "Del esquema PLT al chanchullo". Racket-lang.org . Consultado el 17 de agosto de 2011 .
  28. ^ "Racket 5.2". PLT, Inc. 2011-11-09 . Consultado el 2012-06-16 .
  29. ^ "Submódulos". 2012-06-03 . Consultado el 2012-08-07 .
  30. ^ "Racket 5.3". PLT, Inc. 2012-08-07 . Consultado el 2012-08-07 .
  31. ^ "Racket 5.3.1". PLT, Inc. 2012-11-07 . Consultado el 2012-11-07 .
  32. ^ "Racket 6.0". PLT, Inc. 26 de febrero de 2014. Consultado el 23 de febrero de 2016 .
  33. ^ "Estado de Racket-on-Chez: enero de 2018". 5 de enero de 2018. Archivado desde el original el 28 de junio de 2018. Consultado el 13 de abril de 2018 .
  34. ^ "Construcción de un edificio en Chez Scheme (informe de experiencia)" (PDF) . 2019-08-01 . Consultado el 2019-07-25 .
  35. ^ "Lanzamiento de Racket 7.5". Packt Hub . 22 de noviembre de 2019 . Consultado el 28 de noviembre de 2019 .
  36. ^ "Racket v7.5". Racket | Blog . Consultado el 28 de noviembre de 2019 .
  37. ^ "Raqueta v8.0".
  38. ^ Flatt, M.; Yu, G.; Findler, RB; Felleisen, M. (2007). "Añadir control delimitado y componible a un entorno de programación de producción" (PDF) . Conferencia internacional sobre programación funcional .
  39. ^ "Contratos".
  40. ^ "Hilos".
  41. ^ "Futuros".
  42. ^ "Lugares".
  43. ^ Flatt, Matthew (2012). "Creación de lenguajes en Racket". Comunicaciones de la ACM . Consultado el 8 de abril de 2012 .
  44. ^ Findler, RB; Felleisen, M. (2002). "Contratos para funciones de orden superior" (PDF) . Conferencia internacional sobre programación funcional .
  45. ^ Matthews, J. (2006). "Implementación de componentes con PLaneT: ¿dónde la quieres?". Taller sobre programación funcional y Scheme .
  46. ^ "El sistema de paquetes Racket y Planet".
  47. ^ Flatt, Matthew (2002). "Macros componibles y compilables: ¿cuándo las necesitas?" (PDF) . Conferencia internacional sobre programación funcional .
  48. ^ Flatt, Culpepper, Darais, Findler, Macros que funcionan juntas; enlaces en tiempo de compilación, expansión parcial y contextos de definición
  49. ^ Tobin-Hochstadt, S.; Felleisen, M. (2008). "El diseño y la implementación de un esquema tipado". Principios de los lenguajes de programación .
  50. ^ Barzilay, E.; Clements, J. (2005). "Pereza sin todo el trabajo duro: combinación de lenguajes perezosos y estrictos para la enseñanza". Programación funcional y declarativa en educación .
  51. ^ "El lenguaje de programación Hackett". Blog de Alexis King . Consultado el 16 de junio de 2019 .
  52. ^ The Pyret Crew (24 de mayo de 2011). "El código Pyret; o una justificación del lenguaje de programación Pyret". Pyret . Consultado el 16 de junio de 2019 .
  53. ^ "Programación y lenguajes de programación". Índice de / . 20 de septiembre de 2017 . Consultado el 16 de junio de 2019 .
  54. ^ Flatt, M.; Barzilay, E.; Findler, RB (2009). "Scribble: cerrando el libro sobre herramientas de documentación ad hoc". Conferencia internacional sobre programación funcional .
  55. ^ Findler, RB; Flatt, M. (2004). "Presentación de diapositivas: Presentaciones funcionales". Conferencia internacional sobre programación funcional .
  56. ^ Felleisen, M.; Findler, RB; Flatt, M.; Krishnamurthi, S. (2009). "Un sistema de E/S funcional (o diversión para estudiantes de primer año)" (PDF) . Conferencia internacional sobre programación funcional .
  57. ^ Felleisen, M.; Findler, RB; Flatt, M.; Krishnamurthi, S. (2004). "La estructura e interpretación del plan de estudios de informática" (PDF) . Revista de programación funcional . 14 (4): 365–378. doi :10.1017/S0956796804005076.
  58. ^ ab "Herramientas de análisis: análisis al estilo lex y yacc" . Consultado el 16 de agosto de 2011 .
  59. ^ ab Krishnamurthi, Hopkins; McCarthy; Graunke; Pettyjohn; Felleisen (2007). "Implementación y uso del servidor web PLT Scheme" (PDF) . Revista de programación simbólica y de orden superior . 20 (4): 431–460. doi :10.1007/s10990-007-9008-y. S2CID  17731194.
  60. ^ Implementaciones
  61. ^ RaquetaScript
  62. ^ Picket
  63. ^ Barzilay, E.; Orlovsky, D. (2004). "Interfaz externa para PLT Scheme" (PDF) . Scheme y programación funcional .
  64. ^ "DSL funcionales de mzScheme en el desarrollo de juegos" . Consultado el 8 de mayo de 2012 .
  65. ^ "Bootstrap". bootstrapworld.org . Consultado el 11 de agosto de 2015 .

Lectura adicional

Enlaces externos