Racketは汎用マルチパラダイムプログラミング言語です。Racket 言語はLispの現代方言であり、 Schemeの子孫です。プログラミング言語の設計と実装のためのプラットフォームとして設計されています。[ 9 ]コアとなる Racket 言語に加えて、Racketはプログラミング言語のファミリー[ 10 ]や Racket 上での開発をサポートするツール群[ 11 ]を指す場合にも使用されます。Racket はスクリプト作成、コンピュータサイエンスの教育、研究にも使用されます。
Racket プラットフォームは、ランタイム システム、[ 12 ]ライブラリ、マシンコード、クロス プラットフォーム、インタプリタ、ジャスト イン タイム コンパイル(JIT)など複数のコンパイル モードをサポートするコンパイラ、および Racket で書かれた DrRacket統合開発環境(IDE) を含む Racket 言語の実装を提供します。[ 13 ] Racket は、コンピュータ サイエンスを「リベラル アーツカリキュラムの不可欠な部分」にすることを目指すProgramByDesignアウトリーチ プログラムで使用されています。 [ 14 ] [ 15 ]
Racket 言語の中核は、組み込み言語やドメイン固有言語、クラスやモジュールなどの言語構造、異なる意味論を持つ Racket の別方言を作成できる広範なマクロシステムで知られています。[ 16 ] [ 17 ] [ 18 ] [ 19 ]
プラットフォームの配布は、Apache 2.0およびMIT ライセンスの下で配布される無料のオープンソースソフトウェアです。[ 20 ]コミュニティによって作成された拡張機能やパッケージは、Racket のパッケージカタログにアップロードできます。
Matthias Felleisen は1990 年代半ばに PLT Inc. を設立し、最初は研究グループとしてスタートしましたが、[ 21 ]その後すぐに初心者プログラマー向けの教育教材 (講義、演習/プロジェクト、ソフトウェア) の作成を目的としたプロジェクトとなりました。1995 年 1 月、グループはSchemeをベースとした教育用プログラミング環境を開発することを決定しました。Matthew Flatt は、libscheme、[ 22 ] wxWidgets、およびその他のいくつかのフリー システムから Racket のオリジナルの仮想マシンである MrEd を寄せ集めました。 [ 23 ]その後、Flatt、Robby Findler、Shriram Krishnamurthi 、Cormac Flanagan などを含むチームが、初心者 Scheme プログラマー向けのプログラミング環境であり、段階的型付けの研究環境である DrScheme を開発しました。[ 13 ] DrScheme がサポートする主な開発言語は PLT Scheme と名付けられました。
並行して、チームは高校教師を対象としたワークショップを開始し、プログラム設計と関数型プログラミングの研修を行った。これらの教師とその生徒を対象とした実地テストは、開発の方向性を定める上で重要な手がかりとなった。
その後数年間、PLTはDrSchemeに教育言語、代数ステッパー[ 24 ] 、透過的な読み込み・評価・出力ループ、コンストラクタベースのプリンタ、その他多くの革新的な機能を追加し、アプリケーション品質の教育用プログラム開発環境を作り上げました。2001年までに、コアチーム(Felleisen、Findler、Flatt、Krishnamurthi)は、彼らの教育理念に基づいた最初の教科書『 How to Design Programs』を執筆・出版しました。
Racket Manifesto [ 9 ]では、Racket の開発を推進する原則、設計プロセスの背後にある評価フレームワーク、および将来の改善の機会について詳しく説明しています。
PLT Scheme の最初の世代の改訂では、モジュールとクラスの両方を使用して大規模プログラミングを行うための機能が導入されました。バージョン 42 では、大規模開発のためにクラスを補完する第一級モジュール システムであるユニットが導入されました。[ 25 ]クラス システムでは、これらのバージョンを通じて機能 ( Javaスタイルのインターフェースなど) が追加され、多重継承などのいくつかの機能が失われました。[ 16 ] 言語は、その後のいくつかのバージョンを通じて進化し、バージョン 53 で画期的な人気を獲得し、広範な作業を経て、現在の一般的なバージョン システムで「1.0」リリースに相当する次のバージョン 100 がリリースされました。
次のメジャー改訂はバージョン200と名付けられ、マクロと連携する新しいデフォルトモジュールシステムが導入されました。[ 25 ]特に、モジュールシステムは実行時とコンパイル時の計算を分離し、「言語のタワー」をサポートすることを保証します。[ 26 ]ユニットとは異なり、これらのモジュールは第一級オブジェクトではありません。
バージョン300では、 Unicodeサポート、外部ライブラリサポート、クラスシステムの改良が導入されました。[ 25 ] その後、300シリーズでは、JITコンパイラの追加とデフォルトの世代別ガベージコレクションへの切り替えにより、言語ランタイムのパフォーマンスが向上しました。
次のメジャーリリースまでに、プロジェクトはより一般的なシーケンスベースのバージョン番号付けに切り替えました。バージョン4.0では#lang、モジュールが記述されている言語を指定するための省略記法が導入されました。さらに、この改訂では、不変のペアとリスト、きめ細かい並列処理のサポート、および静的に型付けされた方言が導入されました。[ 27 ]
2010 年 6 月 7 日に、PLT Scheme は Racket に改名されました。[ 28 ]この改名はバージョン 5.0 のリリースと同時に行われました。その後、バージョン 5.1 では、すべてのプラットフォームでネイティブUI ツールキットを使用して、グラフィカル ユーザー インターフェイス(GUI) バックエンドがC++から Racket に書き直されました。 [ 23 ]バージョン 5.2 には、バックグラウンド構文チェックツール、新しいプロットライブラリ、データベース ライブラリ、および新しい拡張 REPL が含まれていました。[ 29 ]バージョン 5.3 には、オプションでロードされるモジュール用の新しいサブモジュール機能、[ 30 ]新しい最適化ツール、JSONライブラリ、およびその他の機能が含まれていました。[ 31 ]バージョン 5.3.1 では、DrRacket に大幅な改善が導入されました。バックグラウンド構文チェッカーがデフォルトで有効になり、新しいドキュメント プレビュー ツールが追加されました。[ 32 ]
バージョン6.0では、Racketは第2世代のパッケージ管理システムをリリースしました。この開発の一環として、主要なDrRacketおよびRacketリポジトリが再編成され、多数の小さなパッケージに分割されたため、最小限のRacketをインストールし、必要なパッケージのみをインストールすることが可能になりました。[ 33 ]
Racket のバージョン 7 は、Chez Schemeランタイム システムへの移行と複数のランタイム システムのサポートの準備の一環として、Racket で記述された新しいマクロ エキスパンダーとともにリリースされました。 [ 34 ] [ 35 ] 2019 年 11 月 19 日に Racket 7.5 がリリースされました。Racket 7.5 のライセンスは制限が少なくなりました。現在は Apache 2.0 ライセンスまたは MIT ライセンスを使用しています。[ 36 ] [ 37 ]
2021年2月13日、Racket 8.0がリリースされました。Racket 8.0は、Racket CSとして知られるChez Schemeランタイムシステムを備えたRacketがデフォルトの実装となった最初のリリースです。Racket CSは、より高速で、保守と開発が容易で、既存のRacketプログラムとの後方互換性があり、並列ガベージコレクションが優れています。[ 38 ]
Racket のコア言語には、マクロ、モジュール、字句クロージャ、末尾呼び出し、区切り継続、[ 39 ]パラメータ (流動変数)、ソフトウェア契約、[ 40 ]グリーン スレッドとOS スレッド、[ 41 ] [ 42 ] [ 43 ]などが含まれます。この言語には、リソース管理を制御し、他のプログラムのロードと管理のためのオペレーティングシステムのように言語が機能できるようにするイベント スペースやカストディアンなどのプリミティブも付属しています。 [ 12 ]強力なマクロ システムを使用して言語をさらに拡張できます。マクロ システムとモジュール システムおよびカスタム パーサーを組み合わせることで、言語のあらゆる側面を制御できます。[ 44 ] Racket のほとんどの言語構造は、基本言語でマクロとして実装されています。これには、ミックスイン クラス システム、[ 16 ] ML モジュール システムでの不透明な属性と同じくらい表現力のあるコンポーネント (またはモジュール) システム、[ 17 ]およびパターン マッチングが含まれます。
さらに、この言語は高階プログラミング言語としては初の契約システムを備えています。[ 45 ] Racketの契約システムは、 Eiffelの契約による設計に触発され、それを第一級関数、オブジェクト、参照セルなどの高階値にも適用できるように拡張しています。たとえば、契約によってチェックされるオブジェクトは、そのメソッドが最終的に呼び出されたときに契約チェックを行うことが保証されます。
Racketには、バイトコードコンパイラとJITコンパイラの両方が含まれています。バイトコードコンパイラは、Racket仮想マシンで実行される内部バイトコード形式を生成し、JITコンパイラは実行時にバイトコードをマシンコードに変換します。
2004年以降、この言語にはPLaneTというパッケージマネージャが同梱されており、これはモジュールシステムに統合されているため、サードパーティライブラリを透過的にインポートして使用できます。また、PLaneTには依存関係地獄を防ぐための組み込みバージョン管理ポリシーがあります。[ 46 ]
2014年末、Racketのコードの大部分は、メインのコードベースとは別の新しいパッケージングシステムに移行されました。この新しいパッケージングシステムは、racoというクライアントプログラムによってサービスされています。新しいパッケージシステムはPLaneTよりも機能が少なく、RacketブログのJay McCarthyによるブログ記事では、変更の理由と古いシステムを複製する方法が説明されています。[ 47 ]
Racket を Lisp ファミリーの他の言語と最も明確に区別する特徴は、新しいドメイン固有言語と汎用言語の構築をサポートする統合された言語拡張機能です。Racket の拡張機能はモジュール システムに組み込まれており、コンテキスト依存のモジュール レベルの構文制御を可能にします。 [ 18 ]例えば、構文形式をオーバーライドして関数適用のセマンティクスを変更できます。同様に、形式によりモジュール全体の任意の静的解析が可能になります。[ 18 ]表記法を介して任意のモジュールを言語として使用できるため、これは事実上、言語のほぼすべての側面をプログラムして制御できることを意味します。#%app#%module-begin#lang
モジュールレベルの拡張機能は、 Schemeに似た衛生的なマクロシステムと組み合わされており、 Lisp のs 式操作システム[ 48 ] [ 49 ] Scheme 84 の衛生的な extend-syntax マクロやR5RSの構文規則よりも多くの機能を提供します。実際、マクロシステムはコンパイラ拡張のための綿密に調整されたアプリケーション プログラミング インターフェイス(API)であると言っても差し支えありません。このコンパイラ API を使用すると、プログラマは組み込み言語構造と全く区別がつかない方法で機能やドメイン固有言語全体を追加できます。
Racket のマクロシステムは、言語の完全な方言を構築するために使用されてきました。これには、型なしコードから型付きコードへの移行を容易にする Racket の段階的型付き方言である Typed Racket [ 50 ] 、遅延評価を備えた方言である Lazy Racket [ 51 ]、およびHaskellと Racketを組み合わせた Hackett [ 52 ]が含まれます。教育用プログラミング言語Pyret は、元々 Racket で実装されました。[ 53 ] [ 54 ]
その他の言語には、FrTime(関数型リアクティブプログラミング)、Scribble(ドキュメンテーション言語)[ 55 ] 、 Slideshow(プレゼンテーション言語)[ 56 ] 、および教育用のいくつかの言語[ 57 ] [ 58 ]などがあります。
Racket のコアディストリビューションには、プログラミング言語の開発を支援するライブラリが含まれています。[ 18 ]このような言語は、 S 式ベースの構文に限定されません。従来の読み取りテーブルベースの構文拡張に加えて、ディレクティブは#lang任意のパーサーの呼び出しを可能にし、これはパーサーツールライブラリを使用して実装できます。[ 59 ]このような言語の例については、Racket の論理プログラミングを参照してください。
この言語プラットフォームは、DrRacket というセルフホスト型IDE [ 13 ]、継続ベースのWeb サーバー[ 60 ]、グラフィカルユーザー インターフェイス[ 23 ]、およびその他のツールを提供します。一般的なスクリプト言語などのライブラリを備えた実用的なスクリプト ツールとして、Unix シェルのスクリプト作成に使用できます。コマンドライン引数を解析し、外部ツールを実行できます。
DrRacket(旧DrScheme)は、SchemeまたはRacketを教える入門コンピュータサイエンスコースで広く使用されており、そのシンプルさと初心者プログラマーへの親しみやすさが高く評価されています。このIDEは元々 、ノースイースタン大学と複数の提携大学が高校生を大学レベルのコンピュータサイエンスコースに引きつけるために実施したアウトリーチ活動であるTeachScheme!プロジェクト(現在はProgramByDesign)で使用するために開発されました。
このエディタは、構文エラーと実行時エラーのハイライト表示、括弧のマッチング、デバッガ、代数ステッパーなどの機能を提供します。学生向けの機能として、複数の「言語レベル」(初級、中級など)をサポートしています。また、ライブラリのサポート機能や、上級プログラマ向けの高度な分析ツールも統合されています。さらに、モジュールブラウザ、輪郭表示、統合されたテストとカバレッジ測定、リファクタリングサポートにより、モジュール指向プログラミングもサポートされています。「ヘルプデスク」と呼ばれる、ハイパーリンクで構成された包括的なヘルプシステムへの統合されたコンテキスト依存アクセスも提供されます。
DrRacketは、 Windows、macOS、Unix、およびX Window Systemを搭載したLinuxで利用可能であり、これらのプラットフォームすべてでプログラムの動作は同様です。
ここに簡単な「ハローワールド!」プログラムを示します。
#lang racket 「こんにちは、世界!」このプログラムを実行すると、以下の出力が得られます。
以下は、もう少し複雑なプログラムです。

#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まで入れ子になったシェルピンスキー三角形を描画します。
このディレクティブを使用すると、ソースファイルをRacketのさまざまな方言で記述できます。以下は、静的型付けされた#langRacketの方言であるTyped Racketで書かれた階乗プログラムの例です。
#lang typed/racket( : fact ( Integer -> Integer )) ( define ( fact n ) ( if ( zero? n ) 1 ( * n ( fact ( - n 1 )))))Racket には現在 2 つの実装があります。どちらもさまざまなアーキテクチャ上の Linux、Windows、および MacOS をサポートしており、バージョン 8.8 (2023 年) までサポートされています。デフォルトの実装はChez Scheme のインクリメンタルコンパイラとランタイムを使用します。代替の実装はプラットフォームに依存しないバイトコードを生成し、ロード時にジャストインタイムコンパイルを使用してマシンコードを生成します。 [ 61 ]
さらに、実験的な実装も存在する。
Racketはプログラミング言語理論を基礎としているだけでなく、実稼働システム向けの汎用言語として設計されました。そのため、Racketディストリビューションには、システムおよびネットワークプログラミング、Web開発[ 60 ] 、基盤となるオペレーティングシステムへの統一インターフェース、動的な外部関数インターフェース[ 64 ]、数種類の正規表現、字句解析器/構文解析器ジェネレータ[ 59 ] 、論理プログラミング、完全なGUIフレームワークを網羅する広範なライブラリが備わっています。
Racketには、商用言語として有用な機能がいくつか備わっており、その中には、Windows、macOS、Unix上でスタンドアロン実行ファイルをコンパイルできる機能、統合開発環境(IDE)に組み込まれたプロファイラとデバッガ、そして単体テストフレームワークなどが含まれる。
Racket は商用プロジェクトや Web アプリケーションで使用されています。注目すべき例としては、 Racket で開発されたArc上で動作するHacker Newsウェブサイトがあります。Naughty Dog は、いくつかのビデオゲームでスクリプト言語として Racket を使用しています。[ 65 ]
RacketはBootstrapプログラムでゲームデザインを通して学生に代数を教えるために使用されています。[ 66 ]
プログラムファイルの標準ファイル拡張子は「.rkt」です。拡張子「.ss」、「.scm」、「.sch」も歴史的によく使われています。