web-dev-qa-db-ja.com

RacketはSchemeとどう違うのですか?

ラケットはSchemeの子孫です。ラケットはR6RSとどう違うのですか?それは何を追加したのか、奪い取ったのか、それともまったく違うのですか?

ラケットは単なる言語ではなく、言語のプラットフォームであることを理解しています。しかし、私はメインのラケット方言に言及しています。

169
mudge

ラケットは、最終的にR6RSではなくR5RSに基づいており、どちらの厳密なスーパーセットでもありません。 Scheme規格と後方互換性がないため、「Scheme」と呼ぶことはできないと思います。

ほとんどの実装は拡張機能を提供しますが、それ以外の場合は下位互換性があります。もちろん、Racketに付属のコンパイラはR5RSまたはR6RSモードでも実行できます。ラケットモードで実行される有効なR5/6RSスキームは、拒否されるか、ランタイムエラーを引き起こすか、本来とは異なる動作をする可能性があります。とはいえ、下位互換性がない主なポイントは次のとおりです。

  • ラケットにはset-cdr!set-car!はなく、set-mcar!はなく、可変として作成されたペアでのみ機能します。
  • Racketがletrecと呼ぶものはR6RSではletrec*と呼ばれ、R5RSには存在しません。R5RSとR6RSがletrecを呼び出すものはRacketに存在しません。
  • ラケットでは、R5RSでエラーが発生する多くのことが自己評価されます。 最も重要なのは空のリスト
  • ラケットは大文字と小文字を区別しますが、R6RSも大文字と小文字を区別します
  • ラケットは( ... )[ ... ]を同等として扱いますが、R5RSは同等ではありませんが、R6RSは同等です。

おそらく他にもありますが、他のほとんどの部品では、ラケットはSchemeのスーパーセットです。

121
Zorf

前述のように、不変のリストが含まれています。また、R6RSレコードシステムよりも少しクリーンな構造システムも含まれています。オブジェクト指向のクラスとオブジェクトシステムがあります。契約による設計のネイティブサポートがあります。 MLモジュールシステムを連想させるユニットシステムと、R6RSモジュールシステムによく似たモジュールシステムがあります。私が言及したのと同じくらい多くのことを忘れたと確信しています。

名前の変更がマーケティングの仕掛け以外のものとして有用であったかどうかはわかりませんが、ラケットは間違いなくスキームの明確な方言です。

33
deinst

PLT SchemeからRacketへの名前変更の理論的根拠は Racketサイトで で議論されています。

21
Norman Gray

Racketには、 "match" のような、R6RSスキームに含まれていない多くの本当に素晴らしい言語構成要素が含まれています。

17
Gautam

Schemeプログラミング言語の言語仕様R5RSは、複数のScheme実装者間の合意に基づいています。これは、言語が非常に安定していることを意味します。また、多くの便利な機能がR5RS標準の一部ではないことを意味します。

ラケットはR5RS上に構築され、大幅に拡張されました。一部の拡張機能はマクロとして定義されていますが、一部の機能はランタイムシステムのサポートを必要とします。

マクロだけでは実装できないラケットの機能:

  • 区切られた継続(call/ccより一般的)
  • 継続マーク
  • スレッド
  • 場所
  • フィッ

モジュールとマクロシステムは、RnRS仕様よりもはるかに一般的です。一緒に #langリーダー/言語仕様により、カスタム言語を(カスタム構文で)定義し、通常のラケットプログラムで使用することができます。

いくつかのケースでは、Racketの動作がR5RSから逸脱している構造を持っています。最も明らかなのは、consが不変のペアを構成することです(mconsは可変のペアを構成します)。不変のペアを持つことの利点の1つは、lengthがO(1)償却時間で実行されるようになったことです。

14
soegaard

1つの大きな例として、Schemeが可変であるのに対して、ラケットリストはデフォルトで不変です。ラケットには、他のスキームにはない多くの標準ライブラリ(Webサーバーなど)も含まれています。

10
Chuck