ラケットはスキームとどう違うのですか?


184

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

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

回答:


132

ラケットは最終的にR5RSに基づいており、R6RSではなく、どちらの厳密なスーパーセットでもありません。どのScheme標準とも下位互換性がないため、「Scheme」とは言えないと思います。

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

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

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


24
In Racket ()は無効であり、自己評価しません。また、ラケットにもっと制限がありますletrec-たとえば、r5rs言語の制限です。letrec*デフォルトの言語で-のようなバージョンを使用するのは意図的な選択です。
Eli Barzilay

9
@ Eli、おっと、そうです、Swindleモードで実行されているラケットは()自己評価を考慮しているようですが、私はそれと混乱していました。()Common Lispのように、Schemeでなぜ自己評価を行わなかったのかはわかりませんでした。
Zorf、2010

それは簡単にオーバーロードすることで変更でき@Zorf #%appものの、:#lang racket (require (rename-in racket [#%app old])) (define-syntax #%app (syntax-rules () [(_) '()] [(_ . rest) (old . rest)])) (null? ()) ;; => #t
スザンヌDupéron

2
この回答は更新する必要があります。ラケットの機能セットは、はるかなどのモジュールおよび言語定義、で、今Schemeのを上回る
CinchBlue

1
@MaliRemorker私はあなたの意味を正確に理解していませんが、Schemeは現在R7RSにあり、R6RSにありました。しかし、ラケットはまだR6RS機能セットよりも優れています。
CinchBlue

36

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

名前の変更がマーケティングギミック以外に役立つかどうかはわかりませんが、ラケットは間違いなくスキームの明確な方言です。


24
名前が変わったのは、彼らが非標準の追加を伴うSchemeの方言になりたくなかったためだと思います—彼らはより多くのものを標準にしたSchemeベースの言語になりたかったのです。PLT SchemeをSchemeの「ただ」の方言として分類することは、RubyをMirahの方言として分類することに似ています。
チャック

5
異なる名前を使用することは賢明な決定だと思います。共通の起源を持つ異なる言語に同じ名前を使用することは、IMOを混乱させるものです。言語にSchemeがサブセットとして含まれていても、非常に多くの追加が含まれているため、非常に異なるプログラミングスタイルを促進する場合でも、名前を変更します。
ジョルジオ


18

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

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

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

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

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

いくつかのケースでは、Racketは、動作がR5RSから逸脱しているコンストラクトを持っています。最も明白なのはcons、不変ペアを構築することです(mcons可変ペアを構築します)。不変のペアを持つことの1つの利点は、lengthO(1)の償却時間で実行されることです。


2
...しかし、O(1)リストの追加が不可能になります。
ネスは

16

ラケットには、"match"のように、R6RSスキームには含まれていない非常に優れた言語構成要素が多数含まれています。


3
「一致」が優れた機能になるのはなぜですか?少なくとも、意見を述べるときは、それについて簡単に説明する必要があります。そうすれば、ラケットに詳しくない人でも、「一致」が理論的に有益である理由を理解できるようになります。
nbro 2017

1
パターンマッチングは、関数型プログラミングの背景を持つ多くの言語で本当に望まれる機能です。残念ながら、R6RSやCommon Lispでもデフォルトでこれを実装しないでください。そのため、これは、ラケットが提供する非常に優れた差分機能です。たとえば、Haskell、Elixir、Rust、F#などの言語は、このタイプの構造を提供し、頻繁に使用されます。私は個人的にLispプログラミングを主にCommon Lispで作成しており、多くの場合、パターンマッチング実装の欠如を見逃しています。
Manoel Vilela 2017

1
matchとてもいいですが、幸いなことにそれは単なるマクロなので、それを持たないLispに簡単に追加できます。Common Lispは、を介してリストで簡単なパターンマッチングを実行できますdestructuring-bind。それにdestructuring-case基づいてマクロを書くのは簡単で、多くの人が持っています。Schemeには移植可能なmatchライブラリがあります。Clojureがありcore.matchます。
ラッシー

マクロは特別なセマンティクスを持つことが多いため、コードを読みにくくする可能性があります。したがって、言語は常にすべての汎用マクロを標準化して、誰もが独自のマクロを作成しないようにする必要があります。Arc&Clojure&Racket&Ocaml&Haskellの場合と同様に、パターンマッチングは、意図をより直接的に指定するため、デフォルトにする必要があります。Caddrのレベルが低すぎます。
aoeu256

12

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

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.