Racket (programming language)
Developer PLT Inc. | | |
First appeared | January 28, 1995 | |
---|---|---|
Stable release | 8.12[1]
/ 8 February 2024 | |
Apache 2.0[2] | ||
Filename extensions | .rkt[3] | |
Website | racket-lang | |
Major implementations | ||
Racket, RacketScript Racket to JavaScript (ES6) compiler, Pycket a Racket implementation using RPython. | ||
Dialects | ||
Typed Racket, FrTime, Lazy Racket, Scribble | ||
Influenced by | ||
Eiffel,[4] Scheme | ||
Influenced | ||
Clojure,[5] Rust,[6][7] Scheme (R6RS)[8] |
Racket is a
The Racket language is a modern dialect of
The Racket platform provides an implementation of the Racket language (including a
The core Racket language is known for its extensive
The platform distribution is
History
Development
In parallel, the team began conducting workshops for high school teachers, training them in program design and functional programming. Field tests with these teachers and their students provided essential clues for directing the development.
Over the following years, PLT added teaching languages, an algebraic stepper,[23] a transparent read–eval–print loop, a constructor-based printer, and many other innovations to DrScheme, producing an application-quality pedagogic program development environment. By 2001, the core team (Felleisen, Findler, Flatt, Krishnamurthi) had also written and published their first textbook, How to Design Programs, based on their teaching philosophy.
The Racket Manifesto[9] details the principles driving the development of Racket, presents the evaluation framework behind the design process, and details opportunities for future improvements.
Version history
The first generation of PLT Scheme revisions introduced features for
The next major revision was named Version 200, which introduced a new default module system that cooperates with macros.
Version 300 introduced
By the next major release, the project had switched to a more conventional
On 7 June 2010, PLT Scheme was renamed Racket.
In version 6.0, Racket released its second-generation package management system. As part of this development, the principal DrRacket and Racket repository was reorganized and split into a large set of small packages, making it possible to install a minimal racket and to install only those packages needed.[32]
Version 7 of Racket was released with a new macro expander written in Racket as part the preparations for supporting moving to the Chez Scheme runtime system and supporting multiple runtime systems.[33] [34] On 19 November 2019, Racket 7.5 was released. The license of Racket 7.5 was less restrictive. They use now either the Apache 2.0 license or the MIT license.[35][36]
On 2021 February 13, Racket 8.0 was released. Racket 8.0 marks the first release where Racket with the Chez Scheme runtime system, known as Racket CS, is the default implementation. Racket CS is faster, easier to maintain and develop, backward-compatible with existing Racket programs, and has better parallel garbage collection.[37]
Features
Racket's core language includes
Further, the language features the first contract system for a higher-order programming language.[44] Racket's contract system is inspired by the
Racket includes both bytecode and JIT (JIT) compilers. The bytecode compiler produces an internal bytecode format run by the Racket virtual machine, and the JIT compiler translates bytecode to machine code at runtime.
Since 2004, the language has also shipped with PLaneT, a package manager that is integrated into the module system so that third-party libraries can be transparently imported and used. Also, PLaneT has a built-in versioning policy to prevent dependency hell.[45]
At the end of 2014, much of Racket's code was moved into a new packaging system separate from the main code base. This new packaging system is serviced by a client program named raco. The new package system provides fewer features than PLaneT; a blog post by Jay McCarthy on the Racket blog explains the rationale for the change and how to duplicate the older system.[46]
Integrated language extensibility and macros
The features that most clearly distinguish Racket from other languages in the Lisp family are its integrated language
#%app
syntactic form can be overridden to change the semantics of function application. Similarly, the #%module-begin
form allows arbitrary static analysis of the entire module.[18]#lang
notation, this effectively means that virtually any aspect of the language can be programmed and controlled.
The module-level extensibility features are combined with a
The macro system in Racket has been used to construct entire language
Other dialects include FrTime (functional reactive programming), Scribble (documentation language),[54] Slideshow (presentation language),[55] and several languages for education.[56][57]
Racket's core distribution provides libraries to aid the development of programming languages.[18] Such languages are not restricted to s-expression based syntax. In addition to conventional readtable-based syntax extensions, the directive #lang
enables the invocation of arbitrary parsers, which can be implemented using the parser tools library.[58] See Racket logic programming for an example of such a language.
Programming environment
The language platform provides a
DrRacket IDE
DrRacket (formerly DrScheme) is widely used among introductory computer science courses that teach Scheme or Racket and is lauded for its simplicity and appeal to beginner programmers. The IDE was originally built for use with the TeachScheme! project (now ProgramByDesign), an outreach effort by Northeastern University and a number of affiliated universities for attracting high school students to computer science courses at the college level.
The editor provides
DrRacket is available for Windows, macOS, Unix, and Linux with the X Window System and programs behave similarly on all these platforms.
Code examples
Here is a trivial "Hello, World!" program:
#lang racket
"Hello, World!"
Running this program produces the output:
- "Hello, World!"
Here is a slightly less trivial program:
#lang racket
(require 2htdp/image)
(let sierpinski ([n 8])
(if (zero? n)
(triangle 2 'solid 'red)
(let ([t (sierpinski (- n 1))])
(freeze (above t (beside t t))))))
This program, taken from the Racket website, draws a
Using the #lang
directive, a source file can be written in different dialects of Racket. Here is an example of the factorial program in Typed Racket, a
#lang typed/racket
(: fact (Integer -> Integer))
(define (fact n)
(if (zero? n) 1 (* n (fact (- n 1)))))
Implementations
Racket currently has two implementations. Both support Linux, Windows and MacOS on a variety of architectures and are supported as at version 8.8 (2023). The default implementation uses the Chez Scheme incremental compiler and runtime. The alternate implementation generates platform-independent bytecode and uses Just-in-time compilation to generate machine code as it is loaded.[60]
In addition, there are experimental implementations:
- RacketScript is an experimental Racket to JavaScript (ES6) compiler. It allows programmers to use both JavaScript’s and Racket’s ecosystem and aims to make this interoperability as smooth as possible.[61]
- Pycket is a Racket implementation generated using the RPython framework.[62]
Applications and practical use
Apart from having a basis in
Racket has several features useful for a commercial language, among them an ability to compile standalone executables under Windows, macOS, and Unix, a profiler and debugger included in the integrated development environment (IDE), and a unit testing framework.
Racket has been used for commercial projects and web applications. A notable example is the Hacker News website, which runs on Arc, which is developed in Racket. Naughty Dog has used it as a scripting language in several video games.[64]
Racket is used to teach students algebra through game design in the Bootstrap program.[65]
References
- ^ Error: Unable to display the reference properly. See the documentation for details.
- ^ Tobin-Hochstadt, Sam; Gerard, Sage; Dueck, Joel; Flatt, Matthew; Software Freedom Conservancy; Chestek, Pamela (2019-11-15). "Completing Racket's relicensing effort". Retrieved 2019-12-27.
- ^ "DrRacket Files". Retrieved 21 July 2019.
The standard file extension for a Racket program file is ".rkt". The extensions ".ss", ".scm", and ".sch" are also historically popular.
- ^ Strickland, T.S.; Fellesisen, Matthias (2010). "DLS 2010: Contracts for First-Class Classes" (PDF).
- ^ Bonnaire-Sergeant, Ambrose (2012). A Practical Optional Type System for Clojure (Thesis). The University of Western Australia.
- ^ "Planet2 questions".
- ^ "Rust Bibliography". GitHub. 23 November 2022.
- ^ Sperber, Michael; Dybvig, R. Kent; Flatt, Matthew; Van Straaten, Anton; et al. (August 2007). "Revised6 Report on the Algorithmic Language Scheme (R6RS)". Scheme Steering Committee. Retrieved 2011-09-13.
- ^ a b Felleisen, M.; Findler, R.B.; Flatt, M.; Krishnamurthi, S.; Barzilay, E.; McCarthy, J.; Tobin-Hochstadt, S. (2015). "The Racket Manifesto" (PDF). Proceedings of the First Summit on Advances in Programming Languages: 113–128.
- ^ "Dialects of Racket and Scheme". Retrieved 2011-08-15.
- ^ "Welcome to Racket". Retrieved 2019-05-15.
- ^ a b Flatt; Findler; Krishnamurthi; Felleisen (1999). Programming Languages as Operating Systems (or, Revenge of the Son of the Lisp Machine). International Conference on Functional Programming.
- ^ a b c Findler; Clements; Flanagan; Flatt; Krishnamurthi; Steckler; Felleisen (2001). "DrScheme: A Programming Environment for Scheme" (PDF). Journal of Functional Programming.
- ^ Felleisen; Findler; Flatt; Krishnamurthi (2004). "The TeachScheme! Project: Computing and Programming for Every Student". Journal of Computer Science Education.
- ^ "Overview". Program by Design. Retrieved 2011-08-17.
- ^ a b c Flatt, M.; Findler, R. B.; Felleisen, M. (2006). "Scheme with Classes, Mixins, and Traits" (PDF). Asian Symposium on Programming Languages and Systems.
- ^ a b Flatt, M.; Felleisen, M. (1998). "Units: Cool Modules for Hot Languages". Programming Language Design and Implementation.
- ^ a b c d Tobin-Hochstadt, S.; St-Amour, V.; Culpepper, R.; Flatt, M.; Felleisen, M. (2011). "Languages as Libraries" (PDF). Programming Language Design and Implementation.
- S2CID 3887010.
- ^ "Racket: Software License". Retrieved 2015-10-20.
- ISBN 978-1880446652. Retrieved 7 July 2013.
- ^ a b c "Rebuilding Racket's Graphics Layer". 2010-12-08. Retrieved 2017-12-11.
- ^ Clements, J.; Flatt, M.; Felleisen, M. (2001). "Modeling an Algebraic Stepper" (PDF). European Symposium on Programming Languages.
- ^ a b c "Racket Core Release Notes". Archived from the original on 2013-07-05. Retrieved 2012-04-15.
- ^ Flatt, M. (2002). "Composable and Compilable Macros". International Conference on Functional Programming.
- ^ "PLT Scheme version 4.0". 2008-06-12. Archived from the original on 2013-02-02. Retrieved 2012-08-07.
- ^ "From PLT Scheme to Racket". Racket-lang.org. Retrieved 2011-08-17.
- ^ "Racket 5.2". PLT, Inc. 2011-11-09. Retrieved 2012-06-16.
- ^ "Submodules". 2012-06-03. Retrieved 2012-08-07.
- ^ "Racket 5.3". PLT, Inc. 2012-08-07. Retrieved 2012-08-07.
- ^ "Racket 5.3.1". PLT, Inc. 2012-11-07. Retrieved 2012-11-07.
- ^ "Racket 6.0". PLT, Inc. 2014-02-26. Retrieved 2016-02-23.
- ^ "Racket-on-Chez Status: January 2018". 2018-01-05. Archived from the original on 2018-06-28. Retrieved 2018-04-13.
- ^ "building Racket on Chez Scheme (Experience Report)" (PDF). 2019-08-01. Retrieved 2019-07-25.
- ^ "Racket 7.5 release". Packt Hub. 22 November 2019. Retrieved 2019-11-28.
- ^ "Racket v7.5". Racket | Blog. Retrieved 2019-11-28.
- ^ "Racket v8.0".
- ^ Flatt, M.; Yu, G.; Findler, R. B.; Felleisen, M. (2007). "Adding Delimited and Composable Control to a Production Programming Environment" (PDF). International Conference on Functional Programming.
- ^ "Contracts".
- ^ "Threads".
- ^ "Futures".
- ^ "Places".
- ^ Flatt, Matthew (2012). "Creating Languages in Racket". Communications of the ACM. Retrieved 2012-04-08.
- ^ Findler, R. B.; Felleisen, M. (2002). "Contracts for Higher-Order Functions" (PDF). International Conference on Functional Programming.
- ^ Matthews, J. (2006). "Component Deployment with PLaneT: You Want it Where?". Scheme and Functional Programming Workshop.
- ^ "The Racket package system and Planet".
- ^ Flatt, Matthew (2002). "Composable and Compilable Macros, You Want it When?" (PDF). International Conference on Functional Programming.
- ^ Flatt, Culpepper, Darais, Findler, Macros that Work Together; Compile-Time Bindings, Partial Expansion, and Definition Contexts
- ^ Tobin-Hochstadt, S.; Felleisen, M. (2008). "The Design and Implementation of Typed Scheme". Principles of Programming Languages.
- ^ Barzilay, E.; Clements, J. (2005). "Laziness Without All the Hard Work: Combining Lazy and Strict Languages for Teaching". Functional and Declarative Programming in Education.
- ^ "The Hackett Programming Language". Alexis King's Blog. Retrieved 16 June 2019.
- ^ The Pyret Crew (24 May 2011). "The Pyret Code; or A Rationale for the Pyret Programming Language". Pyret. Retrieved 16 June 2019.
- ^ "Programming and Programming Languages". Index of /. 20 September 2017. Retrieved 16 June 2019.
- ^ Flatt, M.; Barzilay, E.; Findler, R. B. (2009). "Scribble: Closing the Book on Ad Hoc Documentation Tools". International Conference on Functional Programming.
- ^ Findler, R. B.; Flatt, M. (2004). "Slideshow: Functional Presentations". International Conference on Functional Programming.
- ^ Felleisen, M.; Findler, R. B.; Flatt, M.; Krishnamurthi, S. (2009). "A Functional I/O System (or Fun for Freshman Kids)" (PDF). International Conference on Functional Programming.
- .
- ^ a b "Parser Tools: lex and yacc-style Parsing". Retrieved 2011-08-16.
- ^ S2CID 17731194.
- ^ Implementations
- ^ RacketScript
- ^ Pycket
- ^ Barzilay, E.; Orlovsky, D. (2004). "Foreign Interface for PLT Scheme" (PDF). Scheme and Functional Programming.
- ^ "Functional mzScheme DSLs in Game Development". Retrieved 2012-05-08.
- ^ "Bootstrap". bootstrapworld.org. Retrieved 2015-08-11.
Further reading
- Felleisen et al., 2013. Realm of Racket. No Starch Press.
- Felleisen et al., 2003. How to Design Programs. MIT Press.