ラケットはSchemeの子孫です。ラケットはR6RSとどう違うのですか?それは何を追加したのか、奪い取ったのか、それともまったく違うのですか?
ラケットは単なる言語ではなく、言語のプラットフォームであることを理解しています。しかし、私はメインのラケット方言に言及しています。
ラケットは、最終的にR6RSではなくR5RSに基づいており、どちらの厳密なスーパーセットでもありません。 Scheme規格と後方互換性がないため、「Scheme」と呼ぶことはできないと思います。
ほとんどの実装は拡張機能を提供しますが、それ以外の場合は下位互換性があります。もちろん、Racketに付属のコンパイラはR5RSまたはR6RSモードでも実行できます。ラケットモードで実行される有効なR5/6RSスキームは、拒否されるか、ランタイムエラーを引き起こすか、本来とは異なる動作をする可能性があります。とはいえ、下位互換性がない主なポイントは次のとおりです。
set-cdr!
とset-car!
はなく、set-mcar!
はなく、可変として作成されたペアでのみ機能します。letrec
と呼ぶものはR6RSではletrec*
と呼ばれ、R5RSには存在しません。R5RSとR6RSがletrec
を呼び出すものはRacketに存在しません。( ... )
と[ ... ]
を同等として扱いますが、R5RSは同等ではありませんが、R6RSは同等です。おそらく他にもありますが、他のほとんどの部品では、ラケットはSchemeのスーパーセットです。
前述のように、不変のリストが含まれています。また、R6RSレコードシステムよりも少しクリーンな構造システムも含まれています。オブジェクト指向のクラスとオブジェクトシステムがあります。契約による設計のネイティブサポートがあります。 MLモジュールシステムを連想させるユニットシステムと、R6RSモジュールシステムによく似たモジュールシステムがあります。私が言及したのと同じくらい多くのことを忘れたと確信しています。
名前の変更がマーケティングの仕掛け以外のものとして有用であったかどうかはわかりませんが、ラケットは間違いなくスキームの明確な方言です。
PLT SchemeからRacketへの名前変更の理論的根拠は Racketサイトで で議論されています。
Racketには、 "match" のような、R6RSスキームに含まれていない多くの本当に素晴らしい言語構成要素が含まれています。
Schemeプログラミング言語の言語仕様R5RSは、複数のScheme実装者間の合意に基づいています。これは、言語が非常に安定していることを意味します。また、多くの便利な機能がR5RS標準の一部ではないことを意味します。
ラケットはR5RS上に構築され、大幅に拡張されました。一部の拡張機能はマクロとして定義されていますが、一部の機能はランタイムシステムのサポートを必要とします。
マクロだけでは実装できないラケットの機能:
モジュールとマクロシステムは、RnRS仕様よりもはるかに一般的です。一緒に #lang
リーダー/言語仕様により、カスタム言語を(カスタム構文で)定義し、通常のラケットプログラムで使用することができます。
いくつかのケースでは、Racketの動作がR5RSから逸脱している構造を持っています。最も明らかなのは、cons
が不変のペアを構成することです(mcons
は可変のペアを構成します)。不変のペアを持つことの利点の1つは、length
がO(1)償却時間で実行されるようになったことです。
1つの大きな例として、Schemeが可変であるのに対して、ラケットリストはデフォルトで不変です。ラケットには、他のスキームにはない多くの標準ライブラリ(Webサーバーなど)も含まれています。