Racket (язык программирования)
Racket | |
---|---|
Класс языка |
мультипарадигмальный: объектно-ориентированный, процедурный, рефлективный, функциональный, логический, мета |
Появился в | 1994 |
Автор | PLT Inc. |
Разработчик | Matthias Felleisen[вд] |
Расширение файлов |
.rkt , .rktl , .rktd , .plt , .ss или .scm |
Выпуск | 6.7 (26 октября 2016) |
Система типов | динамическая, строгая, статическая |
Диалекты | Typed Racket, Lazy Racket, Scribble, FrTime и т. д. |
Испытал влияние | Scheme, Eiffel[1] |
Повлиял на | Scheme[2] |
Лицензия | LGPL |
Сайт | racket-lang.org |
Платформа | кроссплатформенный |
Racket (ранее — PLTScheme) — мультипарадигменный язык программирования общего назначения, принадлежащий семейству Lisp/Scheme. Одно из предназначений racket — создание, разработка и реализация языков программирования[3][4]. Язык используется в различных контекстах: как скриптовый язык, как язык общего назначения, в обучении информатике, в научных исследованиях.
Платформа предоставляет пользователю реализацию языка Racket, включая развитую среду выполнения (англ. run time system)[5], различные библиотеки, JIT-компилятор и т. д., а также среду разработки DrRacket (ранее известную, как DrScheme) написанную на Racket[6]. Эта программная среда используется в учебном курсе ProgramByDesign[англ.] массачусетского технологического института[7][8]. Основной язык Racket отличает мощная макросистема, позволяющая создавать встраиваемые и предметно-ориентированные языки программирования, языковые конструкции (к примеру классы и модули) и диалекты Racket с различной семантикой[9][10][11][12].
Система является свободным и открытым ПО, распространяемым на условиях LGPL. Расширения и пакеты, написанные сообществом, доступны на PLaneT[13], веб-дистрибутиве системы[14].
История
Создание
Matthias Felleisen[англ.] основал компанию PLT Inc. в середине 1990-х, первоначально - как исследовательскую группу, а вскоре - проект по производству педагогических материалов для начинающих программистов (лекции, упражнения/проекты, программное обеспечение). В январе 1995 было решено разработать учебную среду программирования на языке Scheme. Matthew Flatt[англ.] собрал MrEd, оригинальную виртуальную машину Racket, используя libscheme, wxWidgets и некоторые другие свободные системы[15]. В течение последующих лет команда, в которую входили, в частности, Flatt, Robert Bruce Findler[англ.], Shriram Krishnamurthi[англ.], Cormac Flanagan, и многие другие выпускали среду DrScheme предназначенную для начинающих программистов-схемеров и исследований в области мягкой типизации (комбинации статической и динамической типизации)[6]. Основной язык программирования, поддерживаемый средой назывался PLT Scheme.
Параллельно с этим, команда начала проведение семинаров для учителей средней школы, обучая их разработке программ и функциональному программированию. Полевые испытания с этими учителями и их учениками определил основные направления развития продукта.
DrScheme был дополнен учебными языками, пошаговый алгебраический вычислитель (англ. algebraic stepper)[16], прозрачный REPL-цикл, подсистему печати на основе конструкторов (cons) и множество других нововведений, которые сделали DrScheme качественным образовательным продуктом. В 2001 году разработчиками языка была написан и опубликован учебник How to Design Programs[англ.], основанный на их философии обучения программированию.
Развитие DrScheme
В первое поколение версий DrScheme были введены средства для программирования в большом[англ.] c использованием модулей и классов. В версии 42 были добавлены юниты: система модулей — объектов первого класса, позволяющая дополнять модули в процессе разработки больших систем[17]. Система классов была с одной стороны дополнена (в частности интерфейсами в стиле Java), а с другой — сокращена (в частности было удалено множественное наследование)[10]. Язык развивался на протяжении ряда последовательных версий и набрал популярность к версии 53, что ещё ускорило работу над ним и следующая версия 100, стала эквивалентом «1.0».
В следующую крупную ревизию, получившую номер 200, была введена новая модульная система по умолчанию, интегрированная с макросами[17]. В частности, модульная система гарантирует, что вычисления время выполнения и вычисления времени компиляции разделены для поддержки «башни языков»[18]. В отличие от юнитов, эти модули не являются объектами первого класса.
В версию 300 введена поддержка Unicode, библиотека интерфейса с внешними функциями[англ.] и изменена система классов[17]. Позднее для релизов версии 300 была улучшена производительность путём добавления JIT-компилятора и сборки мусора с поддержкой поколений объектов.
К следующему мажорному релизу DrScheme перешёл на общепринятую систему нумерации версий на основе десятичных дробей. В версию 4.0 введено сокращение #lang
для указания [под]языка, на котором написан модуль. Также в этот релиз введены неизменяемые пары и списки, поддержка мелкозернистого параллелизма, и статически типизированный диалект[19].
Racket
7 июня 2010 года, PLT Scheme был переименован в Racket[20], что совпало с выпуском версии 5.0. Впоследствии, в версии 5.1, базовая программа GUI была переписана с C++ на Racket c помощью собственного инструментария пользовательского интерфейса на всех платформах[15]. В версии 5.2 включен инструмент фоновой проверки синтаксиса, новую библиотеку-плоттер, библиотеки баз данных, и новый расширенный REPL[21]. В версию 5.3 включена новая функциональность: подмодули для опционально загружаемых модулей[22] , новые инструменты оптимизации, библиотеку JSON, и другие возможности[23]. В версии 5.3.1 значительно улучшен DrRacket: добавлен новый инструмент просмотра документации, проверка синтаксиса в фоне включена по умолчанию[24].
Примеры кода
Тривиальная программа "hello world" будет выглядеть следующим образом:
#lang racket
"Hello, World!"
При её запуске будет выведено:
- "Hello, World!"
Вот чуть менее тривиальная программа:
#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))))))
Данная программа, взятая с сайта Racket, нарисует треугольник Серпинского, с глубиной вложенности 8.
Пример использования генератора:
#lang racket
(require racket/generator)
(define fib
(generator
() (let loop ((x 1)
(y 1))
(yield x)
(loop y (+ x y)))))
Используя директиву #lang
, можно писать программы на альтернативных диалектах Racket'a. Вот пример факториала на Typed Racket, диалекте со статической типизацией:
#lang typed/racket
(: fact (Integer -> Integer))
(define (fact n)
(cond [(zero? n) 1]
[else (* n (fact (- n 1)))]))
Примечания
- ↑ Strickland, T.S.; Fellesisen, Matthias DLS 2010: Contracts for First-Class Classes (2010). Архивировано из оригинала 23 мая 2013 года.
- ↑ Sperber, Michael; Dybvig, R. Kent; Flatt, Matthew; Van Straaten, Anton, et al. Revised6 Report on the Algorithmic Language Scheme (R6RS) . Scheme Steering Committee (August 2007). Дата обращения: 13 сентября 2011. Архивировано из оригинала 23 мая 2013 года.
- ↑ Welcome to Racket . Дата обращения: 15 августа 2011. Архивировано из оригинала 23 мая 2013 года.
- ↑ Dialects of Racket and Scheme . Дата обращения: 15 августа 2011. Архивировано из оригинала 23 мая 2013 года.
- ↑ Flatt; Findler; Krishnamurthi; Felleisen (1999). Programming Languages as Operating Systems (or, Revenge of the Son of the Lisp Machine).
{{cite conference}}
: Неизвестный параметр|booktitle=
игнорируется (|book-title=
предлагается) (справка) - ↑ 1 2 Findler; Clements; Flanagan; Flatt; Krishnamurthi; Steckler; Felleisen (2001). "DrScheme: A Programming Environment for Scheme" (PDF). Journal of Functional Programming.
- ↑ Шаблон:Cite article
- ↑ Overview . Program by Design. Дата обращения: 17 августа 2011. Архивировано из оригинала 23 мая 2013 года.
- ↑ Macros Matter (3 мая 2007). Дата обращения: 8 августа 2011. Архивировано из оригинала 23 мая 2013 года.
- ↑ 1 2 Flatt, M.; Findler, R. B.; Felleisen, M. (2006). "Scheme with Classes, Mixins, and Traits" (PDF). Asian Symposium on Programming Languages and Systems.
{{cite conference}}
: Неизвестный параметр|booktitle=
игнорируется (|book-title=
предлагается) (справка) - ↑ Flatt, M.; Felleisen, M. (1998). "Units: Cool Modules for Hot Languages". Programming Language Design and Implementation.
{{cite conference}}
: Неизвестный параметр|booktitle=
игнорируется (|book-title=
предлагается) (справка) - ↑ Tobin-Hochstadt, S.; St-Amour, V.; Culpepper, R.; Flatt, M.; Felleisen, M. (2011). "Languages as Libraries" (PDF). Programming Language Design and Implementation.
{{cite conference}}
: Неизвестный параметр|booktitle=
игнорируется (|book-title=
предлагается) (справка) - ↑ PLaneT
- ↑ Matthews, J. (2006). "Component Deployment with PLaneT: You Want it Where?". Scheme and Functional Programming Workshop.
{{cite conference}}
: Неизвестный параметр|booktitle=
игнорируется (|book-title=
предлагается) (справка) - ↑ 1 2 Rebuilding Racket's Graphics Layer (8 декабря 2010). Дата обращения: 23 августа 2011. Архивировано из оригинала 23 мая 2013 года.
- ↑ Clements, J.; Flatt, M.; Felleisen, M. (2001). "Modeling an Algebraic Stepper" (PDF). European Symposium on Programming Languages.
{{cite conference}}
: Неизвестный параметр|booktitle=
игнорируется (|book-title=
предлагается) (справка) - ↑ 1 2 3 "Racket Core Release Notes" . Дата обращения: 15 апреля 2012. Архивировано из оригинала 23 мая 2013 года.
- ↑ Flatt, M. (2002). "Composable and Compilable Macros". International Conference on Functional Programming.
{{cite conference}}
: Неизвестный параметр|booktitle=
игнорируется (|book-title=
предлагается) (справка) - ↑ PLT Scheme version 4.0 (12 июня 2008). Дата обращения: 7 августа 2012. Архивировано из оригинала 23 мая 2013 года.
- ↑ From PLT Scheme to Racket . Racket-lang.org. Дата обращения: 17 августа 2011. Архивировано из оригинала 23 мая 2013 года.
- ↑ Racket 5.2 (9 ноября 2011). Дата обращения: 16 июня 2012. Архивировано из оригинала 23 мая 2013 года.
- ↑ Submodules (3 июня 2012). Дата обращения: 7 августа 2012. Архивировано из оригинала 23 мая 2013 года.
- ↑ Racket 5.3 (7 августа 2012). Дата обращения: 7 августа 2012. Архивировано из оригинала 23 мая 2013 года.
- ↑ Racket 5.3.1 (7 ноября 2012). Дата обращения: 7 ноября 2012. Архивировано из оригинала 23 мая 2013 года.
Литература
- Matthias Felleisen, Conrad Barski M.D., David Van Horn, Eight Students of Northeastern University. Realm of Racket: Learn to Program, One Game at a Time!. — no starch press, June 2013. — 312 p. — ISBN 978-1-59327-491-7.
Уроки
- Quick: An Introduction to Racket with Pictures
- F*dging up a Racket—shows how to write a Brainfuck dialect for Racket
- Raw strings in Racket—a reader extension for raw strings
Руководство по стилю
- How to Program Racket (work in Progress as of 2011-09-25)
Ссылки
- racket-lang.org — официальный сайт Racket
- Blog
- Code Repository
- PLaneT
- The Racket Guide
- The Racket Reference
- All Racket Documentation
- Языки программирования по алфавиту
- Языки программирования, появившиеся в 1994 году
- Функциональные языки программирования
- Объектно-ориентированные языки программирования
- Языки программирования с расширяемым синтаксисом
- Семейство языков программирования лисп
- Языки программирования для образования
- Свободное кросс-платформенное программное обеспечение
- Свободные компиляторы и интерпретаторы
- Реализации языка программирования Scheme