Raqueta es una de propósito general , multi-paradigma de lenguaje de programación basado en el Esquema dialecto de Lisp . Está diseñado como una plataforma para el diseño e implementación de lenguajes de programación . [9] Además del lenguaje principal de Racket, Racket también se usa para referirse a la familia de lenguajes de programación [10] y al conjunto de herramientas que apoyan el desarrollo en y con Racket. [11] La raqueta también se utiliza para la creación de scripts , la educación en ciencias de la computación y la investigación.
Paradigma | Multi-paradigma : funcional , imperativo , lógico , meta , modular , orientado a objetos , reflexivo |
---|---|
Familia | Ceceo |
Diseñada por | PLT Inc. |
Desarrollador | PLT Inc. |
Apareció por primera vez | 1995 |
Lanzamiento estable | 8.1 [1] / 4 de mayo de 2021 |
Disciplina de mecanografía | Dinámico , estático , fuerte |
Plataforma | x86 , PowerPC , SPARC , MIPS , ARM |
SO | Multiplataforma |
Licencia | MIT o Apache 2.0 [2] |
Extensiones de nombre de archivo | .rkt [3] |
Sitio web | racket-lang |
Dialectos | |
FrTime, raqueta perezosa, garabato, raqueta escrita | |
Influenciado por | |
Eiffel , [4] Esquema | |
Influenciado | |
Clojure , [5] Rust , [6] [7] Esquema [8] |
La plataforma Racket proporciona una implementación del lenguaje Racket (incluido un sistema de tiempo de ejecución , [12] bibliotecas y un compilador 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 principal de Racket es conocido por su extenso sistema de macros que permite crear lenguajes embebidos 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 plataforma de distribución es un software gratuito 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 la década de 1990, primero como 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 de Racket, de libscheme, [21] wxWidgets y algunos otros sistemas gratuitos. [22] En los años que siguieron, un equipo que incluía a Flatt, Robby Findler , Shriram Krishnamurthi , Cormac Flanagan y muchos otros produjeron DrScheme, un entorno de programación para programadores principiantes de Scheme y un entorno de investigación para la escritura suave . [13] El principal lenguaje de desarrollo que soportaba DrScheme se llamaba PLT Scheme.
Paralelamente, el equipo comenzó a realizar talleres para docentes de secundaria, capacitándolos en diseño de programas y programación funcional. Las pruebas de campo con estos profesores y sus alumnos proporcionaron pistas esenciales para dirigir el desarrollo.
Durante los años siguientes, PLT agregó lenguajes de enseñanza, un paso a paso algebraico, [23] un ciclo de lectura-evaluación-impresión transparente , una impresora basada en constructor y muchas otras innovaciones a DrScheme, produciendo un entorno de desarrollo de programas pedagógicos con 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, Cómo diseñar programas , basado en su filosofía de enseñanza.
El Manifiesto de la Raqueta [9] detalla los principios que impulsan el desarrollo de la Raqueta, presenta el marco de evaluación detrás del proceso de diseño y detalla las oportunidades para futuras mejoras.
Historial de versiones
La primera generación de revisiones del esquema PLT introdujo características para la programación en grande 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 una serie de versiones sucesivas y ganó una gran popularidad en la Versión 53, lo que llevó a un trabajo extenso y 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ódulo predeterminado que coopera con macros. [24] En particular, el sistema de módulos asegura que el tiempo de ejecución y el 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 compatibilidad con Unicode , compatibilidad con bibliotecas externas y mejoras en el sistema de clases. [24] Más tarde, la serie 300 mejoró el rendimiento del tiempo de ejecución del lenguaje con la adición de un compilador JIT y un cambio a una recolección de basura generacional predeterminada .
Para la siguiente versión principal, el proyecto había cambiado a una numeración de versiones más convencional basada en secuencias . La versión 4.0 introdujo la #lang
abreviatura para especificar el idioma en el que está escrito un módulo. Además, la revisión introdujo pares y listas inmutables , soporte para 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, el backend de 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 trazado, una biblioteca de base de datos y un nuevo REPL ampliado. [28] La versión 5.3 incluía una nueva característica de submódulo para módulos cargados opcionalmente, [29] nuevas herramientas de optimización , una biblioteca JSON y otras características. [30] La versión 5.3.1 introdujo mejoras importantes en DrRacket: el verificador de sintaxis en segundo plano estaba activado 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 administración de paquetes de segunda generación. Como parte de este desarrollo, el repositorio principal de DrRacket y Racket se reorganizó y dividió en un gran conjunto de paquetes pequeños, lo que hizo posible instalar una raqueta mínima 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 el cambio al sistema de tiempo de ejecución Chez Scheme y admitir varios sistemas de tiempo 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 donde Racket CS es la implementación predeterminada. Racket CS es más rápido, más fácil de mantener y desarrollar, y es compatible con los programas Racket existentes, tiene una mejor recolección de basura paralela y, por lo general, ofrece una reducción del 10% al 30% en el tamaño del código generado. [37]
Características
El lenguaje central de Racket incluye macros , módulos , cierres léxicos , llamadas finales , continuaciones delimitadas , [38] parámetros (variables fluidas), contratos de software , [39] subprocesos verdes y subprocesos de SO , [40] [41] [42] y más. El lenguaje también viene con primitivas, como espacios de eventos y custodios, que controlan la administración de recursos y permiten que el lenguaje actúe como un sistema operativo para cargar y administrar otros programas. [12] Se crean más extensiones del lenguaje con el potente 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 de 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 la coincidencia de patrones .
Además, el lenguaje presenta el primer sistema de contrato para un lenguaje de programación de orden superior . [44] El sistema de contrato de Racket está inspirado en el trabajo Design by Contract para Eiffel y lo amplía para trabajar 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 comprueba mediante un contrato realice comprobaciones de contrato cuando finalmente se invocan sus métodos.
Racket incluye compiladores de código de bytes y JIT (JIT). El compilador de código de bytes produce un formato de código de bytes interno ejecutado por la máquina virtual Racket , y el compilador JIT traduce el código de bytes a código de máquina en tiempo de ejecución.
Desde 2004, el lenguaje también se incluye 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 forma transparente. Además, PLaneT tiene una política de control de versiones incorporada para evitar el infierno de la dependencia . [45]
A finales de 2014, gran parte del código de Racket se trasladó a un nuevo sistema de empaquetado separado de la base del código principal. Este nuevo sistema de empaque es atendido por un programa cliente llamado raco . El nuevo sistema de paquetes ofrece menos funciones que PLaneT; una publicación de blog de Jay McCarthy en el blog de Racket explica la justificación del cambio y cómo duplicar el sistema anterior. [46]
Extensibilidad y macros de lenguaje integradas
Las características que distinguen más claramente a Racket de otros lenguajes de la familia Lisp son sus características integradas de extensibilidad de idiomas que admiten la construcció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 #%app
forma sintáctica se puede anular para cambiar la semántica de la aplicación de la función . Del mismo modo, el #%module-begin
formulario permite un análisis estático arbitrario de todo el módulo. [18] Dado que cualquier módulo puede usarse como lenguaje, a través de la #lang
notación, esto significa efectivamente que prácticamente cualquier aspecto del lenguaje puede ser programado y controlado.
Las características de extensibilidad a nivel de módulo se combinan con un sistema macro higiénico similar a Scheme , que proporciona más características que el sistema de manipulación de expresión s de Lisp , [47] [48] macros higiénicas de sintaxis extendida de Scheme 84 o 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 las extensiones del compilador . Con esta API de compilación, los programadores pueden agregar características y lenguajes específicos de dominio completos de una manera que los hace completamente indistinguibles de las construcciones de lenguaje integradas.
El sistema de macros de Racket se ha utilizado para construir dialectos de idiomas completos . Esto incluye Typed raqueta, que es un dialecto mecanografiado gradualmente de la raqueta que facilita la migración de sin tipo de código con tipo, [49] Lazy Raqueta-un dialecto con evaluación perezosa , [50] y Hackett, que combina Haskell y la raqueta. [51] El lenguaje de programación pedagógica Pyret se implementó originalmente en Racket. [52] [53]
Otros dialectos incluyen FrTime ( programación funcional reactiva ), Scribble (lenguaje de documentación), [54] Slideshow ( lenguaje de presentación ), [55] y varios lenguajes para la educación. [56] [57]
La distribución principal de Racket proporciona bibliotecas para ayudar al desarrollo de lenguajes de programación. [18] Estos lenguajes no están restringidos a la sintaxis basada en expresiones-s . Además de las extensiones de sintaxis convencionales basadas en tablas de lectura, la directiva #lang
permite la invocación de analizadores arbitrarios, que se pueden implementar utilizando la biblioteca de herramientas del analizador. [58] Consulte Programación lógica de raquetas para ver un ejemplo de dicho lenguaje.
Entorno de programación
La plataforma de lenguaje proporciona una auto-organizada IDE [13] llamado DrRacket, una basada en la continuación del servidor web , [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 crear scripts en el shell de Unix. Puede analizar los argumentos de la línea de comandos y ejecutar herramientas externas.
DrRacket IDE
DrRacket (anteriormente DrScheme) se usa ampliamente entre los cursos de introducción a la informática que enseñan Scheme o Racket y es elogiado por su simplicidad y atractivo para los programadores principiantes. ¡El IDE se creó originalmente para su uso con TeachScheme! proyecto (ahora ProgramByDesign ), un esfuerzo de divulgación de Northeastern University y varias universidades afiliadas para atraer estudiantes de secundaria a cursos de informática a nivel universitario.
El editor proporciona resaltado para errores de sintaxis y tiempo de ejecución, coincidencia de paréntesis, un depurador y un paso a paso algebraico. Sus características amigables para los estudiantes incluyen soporte para múltiples "niveles de idioma" (estudiante principiante, estudiante intermedio, etc.). También tiene soporte de biblioteca integrado y sofisticadas herramientas de análisis 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 soporte de refactorización . Proporciona acceso integrado y sensible al contexto a un extenso sistema de ayuda hipervinculado 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 de hola mundo :
#lang raqueta "¡Hola, mundo!"
La ejecución de este programa produce la salida:
- "¡Hola Mundo!"
Aquí hay un programa un poco menos trivial:
#lang racket ( requiere 2htdp / image )( let sierpinski ([ n 8 ]) ( if ( zero? n ) ( triángulo 2 rojo ' sólido ' ) ( let ([ t ( sierpinski ( - n 1 ))]) ( freeze ( sobre t ( al lado de t t )) ))))
Este programa, tomado del sitio web de Racket, dibuja un triángulo de Sierpinski , anidado a la profundidad 8.
Usando la #lang
directiva, un archivo fuente se puede escribir en diferentes dialectos de Racket. Aquí hay un ejemplo del programa factorial en Typed Racket, un dialecto de tipo estático de Racket:
#lang typed / racket( : hecho ( Entero -> Entero )) ( definir ( hecho n ) ( si ( cero? n ) 1 ( * n ( hecho ( - n 1 )))))
Aplicaciones y uso práctico
Además de tener una base en la teoría del lenguaje 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 presenta una biblioteca extensa que cubre sistemas y programación de redes, desarrollo web, [59] una interfaz uniforme para el sistema operativo subyacente, una interfaz dinámica de función externa , [60] varios tipos de expresiones regulares , generadores de lexer / parser , [58] programación lógica y un marco GUI 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 un 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 , que se desarrolla en Racket. Naughty Dog lo ha utilizado como lenguaje de programación en varios de sus videojuegos. [61]
La raqueta se usa para enseñar álgebra a los estudiantes a través del diseño de juegos en el programa Bootstrap . [62]
Referencias
- ^ "Versión 8.1" . 4 de mayo de 2021 . Consultado el 5 de mayo de 2021 .
- ^ 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 .
- ^ "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.
- ^ Strickland, TS; Fellesisen, Matthias (2010). "DLS 2010: Contratos para clases de primera clase" (PDF) .
- ^ Bonnaire-Sergeant, Ambrose (2012). Un sistema práctico de tipos opcionales para Clojure (tesis). Universidad de Australia Occidental.
- ^ "Preguntas Planet2" .
- ^ "Bibliografía de óxido" .
- ^ Sperber, Michael; Dybvig, R. Kent; Flatt, Matthew; Van Straaten, Anton; et al. (Agosto de 2007). " Informe revisado 6 sobre el esquema de lenguaje algorítmico (R6RS)" . Comité Directivo del Esquema . Consultado el 13 de septiembre de 2011 .
- ^ a b 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.
- ^ "Dialectos de raqueta y esquema" . Consultado el 15 de agosto de 2011 .
- ^ "Bienvenido a Racket" . Consultado el 15 de mayo de 2019 .
- ^ a b Flatt; Findler; Krishnamurthi; Felleisen (1999). Lenguajes de programación como sistemas operativos (o, La venganza del hijo de la máquina Lisp) . Congreso Internacional de Programación Funcional.
- ^ a b c Findler; Clements; Flanagan; Flatt; Krishnamurthi; Steckler; Felleisen (2001). "DrScheme: un entorno de programación para el esquema" (PDF) . Revista de programación funcional .
- ^ Felleisen; Findler; Flatt; Krishnamurthi (2004). "El proyecto TeachScheme !: Computación y programación para cada estudiante" . Revista de Educación en Ciencias de la Computación .
- ^ "Resumen" . Programa por diseño . Consultado el 17 de agosto de 2011 .
- ^ a b c Flatt, M .; Findler, RB; Felleisen, M. (2006). "Esquema con clases, mixins y rasgos" (PDF) . Simposio asiático sobre lenguajes y sistemas de programación .
- ^ a b Flatt, M .; Felleisen, M. (1998). "Unidades: módulos geniales para lenguajes calientes" . Diseño e implementación de lenguajes de programación .
- ^ a b c d Tobin-Hochstadt, S .; St-Amour, V .; Culpepper, R .; Flatt, M .; Felleisen, M. (2011). "Idiomas como bibliotecas" (PDF) . Diseño e implementación de lenguajes de programación .
- ^ Felleisen, Matthias; Findler, Robert Bruce; Flatt, Matthew; 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 .
- ^ "Raqueta: Licencia de software" . Consultado el 20 de octubre de 2015 .
- ^ Benson, Brent W. Jr. (26 a 28 de octubre de 1994). "libscheme: Esquema como una biblioteca C" . Escrito en Santa Fe, NM. Actas del Simposio de USENIX sobre idiomas de muy alto nivel . Berkeley, CA: Asociación USENIX. págs. 7-19. ISBN 978-1880446652. Consultado el 7 de julio de 2013 .
- ^ a b c "Reconstrucción de la capa de gráficos de la raqueta" . 2010-12-08 . Consultado el 11 de diciembre de 2017 .
- ^ Clements, J .; Flatt, M .; Felleisen, M. (2001). "Modelado de un paso a paso algebraico" (PDF) . Simposio europeo de lenguajes de programación .
- ^ a b c "Notas de la versión de Racket Core" . Archivado desde el original el 23 de mayo de 2013 . Consultado el 15 de abril de 2012 .
- ^ Flatt, M. (2002). "Macros componibles y compilables". Congreso Internacional de Programación Funcional .
- ^ "PLT Scheme versión 4.0" . 2008-06-12. Archivado desde el original el 23 de mayo de 2013 . Consultado el 7 de agosto de 2012 .
- ^ "Del esquema PLT a la raqueta" . Racket-lang.org . Consultado el 17 de agosto de 2011 .
- ^ "Raqueta 5.2" . PLT, Inc. 2011-11-09 . Consultado el 16 de junio de 2012 .
- ^ "Submódulos" . 2012-06-03 . Consultado el 7 de agosto de 2012 .
- ^ "Raqueta 5.3" . PLT, Inc. 2012-08-07 . Consultado el 7 de agosto de 2012 .
- ^ "Raqueta 5.3.1" . PLT, Inc. 2012-11-07 . Consultado el 7 de noviembre de 2012 .
- ^ "Raqueta 6.0" . PLT, Inc. 2014-02-26 . Consultado el 23 de febrero de 2016 .
- ^ "Estado de Racket-on-Chez: enero de 2018" . 2018-01-05. Archivado desde el original el 13 de abril de 2018 . Consultado el 13 de abril de 2018 .
- ^ "Construyendo Racket on Chez Scheme (Informe de experiencia)" (PDF) . 2019-08-01 . Consultado el 25 de julio de 2019 .
- ^ "Lanzamiento de la raqueta 7.5" . Packt Hub . Consultado el 28 de noviembre de 2019 .
- ^ "Raqueta v7.5" . Raqueta | Blog . Consultado el 28 de noviembre de 2019 .
- ^ https://blog.racket-lang.org/2021/02/racket-v8-0.html
- ^ Flatt, M .; Yu, G .; Findler, RB; Felleisen, M. (2007). "Agregar control delimitado y componible a un entorno de programación de producción" (PDF) . Congreso Internacional de Programación Funcional .
- ^ "Contratos" .
- ^ "Hilos" .
- ^ "Futuros" .
- ^ "Lugares" .
- ^ Flatt, Matthew (2012). "Creando lenguajes en la raqueta" . Comunicaciones de la ACM . Consultado el 8 de abril de 2012 .
- ^ Findler, RB; Felleisen, M. (2002). "Contratos para funciones de orden superior" (PDF) . Congreso Internacional de Programación Funcional .
- ^ Matthews, J. (2006). "Despliegue de componentes con PLaneT: ¿lo quiere dónde?". Taller de Esquema y Programación Funcional .
- ^ "El sistema de paquetes Racket y Planet" .
- ^ Flatt, Matthew (2002). "Macros compilables y compilables, ¿lo desea cuando?" (PDF) . Congreso Internacional de Programación Funcional .
- ^ Flatt, Culpepper, Darais, Findler, Macros que funcionan en conjunto; Vinculaciones en tiempo de compilación, expansión parcial y contextos de definición
- ^ Tobin-Hochstadt, S .; Felleisen, M. (2008). "El Diseño e Implementación de Esquema Mecanografiado". Principios de los lenguajes de programación .
- ^ 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 .
- ^ "El lenguaje de programación Hackett" . Blog de Alexis King . Consultado el 16 de junio de 2019 .
- ^ 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 .
- ^ "Programación y lenguajes de programación" . Índice de / . 20 de septiembre de 2017 . Consultado el 16 de junio de 2019 .
- ^ Flatt, M .; Barzilay, E .; Findler, RB (2009). "Garabato: cierre del libro sobre herramientas de documentación ad hoc". Congreso Internacional de Programación Funcional .
- ^ Findler, RB; Flatt, M. (2004). "Slideshow: Presentaciones funcionales". Congreso Internacional de Programación Funcional .
- ^ Felleisen, M .; Findler, RB; Flatt, M .; Krishnamurthi, S. (2009). "Un sistema de E / S funcional (o diversión para los niños de primer año)" (PDF) . Congreso Internacional de Programación Funcional .
- ^ Felleisen, M .; Findler, RB; Flatt, M .; Krishnamurthi, S. (2004). "La Estructura e Interpretación del Currículo de Informática" (PDF) . Revista de programación funcional . 14 (4): 365–378. doi : 10.1017 / S0956796804005076 .
- ^ a b "Herramientas de analizador: análisis de estilo lex y yacc" . Consultado el 16 de agosto de 2011 .
- ^ a b Krishnamurthi, Hopkins; McCarthy; Graunke; Pettyjohn; Felleisen (2007). "Implementación y uso del servidor web del esquema PLT" (PDF) . Revista de programación simbólica y de orden superior . 20 (4): 431–460. doi : 10.1007 / s10990-007-9008-y . S2CID 17731194 .
- ^ Barzilay, E .; Orlovsky, D. (2004). "Interfaz extranjera para el esquema PLT" (PDF) . Esquema y programación funcional .
- ^ "DSL de mzScheme funcionales en el desarrollo de juegos" . Consultado el 8 de mayo de 2012 .
- ^ "Bootstrap" . bootstrapworld.org . Consultado el 11 de agosto de 2015 .
Otras lecturas
- Felleisen y col. , 2013. Reino de la raqueta . Sin prensa de almidón.
- Felleisen y col. , 2003. Cómo diseñar programas . Prensa del MIT.
enlaces externos
- Página web oficial