TY - GEN
T1 - Languages as libraries
AU - Tobin-Hochstadt, Sam
AU - St-Amour, Vincent
AU - Culpepper, Ryan
AU - Flatt, Matthew
AU - Felleisen, Matthias
PY - 2011
Y1 - 2011
N2 - Programming language design benefits from constructs for extending the syntax and semantics of a host language. While C's string-based macros empower programmers to introduce notational shorthands, the parser-level macros of Lisp encourage experimentation with domain-specific languages. The Scheme programming language improves on Lisp with macros that respect lexical scope. The design of Racket - -a descendant of Scheme - -goes even further with the introduction of a full-fledged interface to the static semantics of the language. A Racket extension programmer can thus add constructs that are indistinguishable from "native" notation, large and complex embedded domain-specific languages, and even optimizing transformations for the compiler backend. This power to experiment with language design has been used to create a series of sub-languages for programming with first-class classes and modules, numerous languages for implementing the Racket system, and the creation of a complete and fully integrated typed sister language to Racket's untyped base language. This paper explains Racket's language extension API via an implementation of a small typed sister language. The new language provides a rich type system that accommodates the idioms of untyped Racket. Furthermore, modules in this typed language can safely exchange values with untyped modules. Last but not least, the implementation includes a type-based optimizer that achieves promising speedups. Although these extensions are complex, their Racket implementation is just a library, like any other library, requiring no changes to the Racket implementation.
AB - Programming language design benefits from constructs for extending the syntax and semantics of a host language. While C's string-based macros empower programmers to introduce notational shorthands, the parser-level macros of Lisp encourage experimentation with domain-specific languages. The Scheme programming language improves on Lisp with macros that respect lexical scope. The design of Racket - -a descendant of Scheme - -goes even further with the introduction of a full-fledged interface to the static semantics of the language. A Racket extension programmer can thus add constructs that are indistinguishable from "native" notation, large and complex embedded domain-specific languages, and even optimizing transformations for the compiler backend. This power to experiment with language design has been used to create a series of sub-languages for programming with first-class classes and modules, numerous languages for implementing the Racket system, and the creation of a complete and fully integrated typed sister language to Racket's untyped base language. This paper explains Racket's language extension API via an implementation of a small typed sister language. The new language provides a rich type system that accommodates the idioms of untyped Racket. Furthermore, modules in this typed language can safely exchange values with untyped modules. Last but not least, the implementation includes a type-based optimizer that achieves promising speedups. Although these extensions are complex, their Racket implementation is just a library, like any other library, requiring no changes to the Racket implementation.
KW - extensible languages
KW - macros
KW - modules
KW - typed racket
UR - http://www.scopus.com/inward/record.url?scp=79959888171&partnerID=8YFLogxK
UR - http://www.scopus.com/inward/citedby.url?scp=79959888171&partnerID=8YFLogxK
U2 - 10.1145/1993498.1993514
DO - 10.1145/1993498.1993514
M3 - Conference contribution
AN - SCOPUS:79959888171
SN - 9781450306638
T3 - Proceedings of the ACM SIGPLAN Conference on Programming Language Design and Implementation (PLDI)
SP - 132
EP - 141
BT - PLDI'11 - Proceedings of the 2011 ACM Conference on Programming Language Design and Implementation
T2 - 32nd ACM SIGPLAN Conference on Programming Language Design and Implementation, PLDI'11
Y2 - 4 June 2011 through 8 June 2011
ER -