回答:
ラケットは最終的にR5RSに基づいており、R6RSではなく、どちらの厳密なスーパーセットでもありません。どのScheme標準とも下位互換性がないため、「Scheme」とは言えないと思います。
ほとんどの実装は拡張機能を提供しますが、他の点では下位互換性があります。もちろん、Racketに付属するコンパイラーはR5RSまたはR6RSモードでも実行できます。ラケットモードで実行される有効なR5 / 6RSスキームは、拒否されるか、実行時エラーが発生するか、本来の動作とは異なる場合があります。それでも、下位互換性がない主な点は次のとおりです。
set-cdr!
and set-car!
がなくset-mcar!
、可変として特別に作成されたペアでのみ機能します。letrec
呼び出さletrec*
れ、R5RSには存在しないラケットの呼び出し、R5RSおよびR6RSの呼び出しletrec
はラケットに存在しません。( ... )
と[ ... ]
同等のものとして、R5RSはしませんが、R6RSはありません。おそらくもっとありますが、他のほとんどの部分では、ラケットはSchemeのスーパーセットです。
()
自己評価を考慮しているようですが、私はそれと混乱していました。()
Common Lispのように、Schemeでなぜ自己評価を行わなかったのかはわかりませんでした。
#%app
ものの、:#lang racket (require (rename-in racket [#%app old])) (define-syntax #%app (syntax-rules () [(_) '()] [(_ . rest) (old . rest)])) (null? ()) ;; => #t
前述のように、不変のリストが含まれています。また、R6RSレコードシステムより少しクリーンな構造システムも含まれています。オブジェクト指向のクラスとオブジェクトシステムがあります。契約による設計をネイティブでサポートしています。MLモジュールを連想させる単位系だけでなく、R6RSモジュール系と同様のモジュール系を持っています。私が言ったのと同じくらい多くのことを忘れたと確信しています。
名前の変更がマーケティングギミック以外に役立つかどうかはわかりませんが、ラケットは間違いなくスキームの明確な方言です。
Schemeプログラミング言語の言語仕様R5RSは、複数のScheme実装者間の合意に基づいています。これは、言語が非常に安定していることを意味します。また、多くの便利な機能がR5RS標準の一部ではないことも意味します。
ラケットはR5RSに基づいて構築され、大幅に拡張されました。一部の拡張機能はマクロとして定義されていますが、一部の機能にはランタイムシステムのサポートが必要です。
マクロだけでは実装できないラケットの機能:
モジュールとマクロシステムは、RnRS仕様よりもはるかに一般的です。#lang
リーダー/言語仕様とともに、カスタム言語を(カスタム構文で)定義し、通常のラケットプログラムで使用することができます。
いくつかのケースでは、Racketは、動作がR5RSから逸脱しているコンストラクトを持っています。最も明白なのはcons
、不変ペアを構築することです(mcons
可変ペアを構築します)。不変のペアを持つことの1つの利点は、length
O(1)の償却時間で実行されることです。
ラケットには、"match"のように、R6RSスキームには含まれていない非常に優れた言語構成要素が多数含まれています。
match
とてもいいですが、幸いなことにそれは単なるマクロなので、それを持たないLispに簡単に追加できます。Common Lispは、を介してリストで簡単なパターンマッチングを実行できますdestructuring-bind
。それにdestructuring-case
基づいてマクロを書くのは簡単で、多くの人が持っています。Schemeには移植可能なmatch
ライブラリがあります。Clojureがありcore.match
ます。
()
は無効であり、自己評価しません。また、ラケットにはもっと制限がありますletrec
-たとえば、r5rs
言語の制限です。letrec*
デフォルトの言語で-のようなバージョンを使用するのは意図的な選択です。