web-dev-qa-db-ja.com

Clojure、Scheme / Racket、Common Lispの違いは何ですか?

私はそれらがLISPと呼ばれる同じ言語の方言であることを知っていますが、違いは正確には何ですか?可能であれば、構文、特性、機能、リソースなどのトピックを網羅した概要を教えてください。

111
MaiaVictor

それらにはすべて共通点がたくさんあります。

  • 動的言語
  • 厳密に入力
  • 編集済み
  • LISPスタイルの構文、つまりコードはLISPデータ構造(フォーム)として記述され、最も一般的なパターンは次のような関数呼び出しです:(function-name arg1 arg2)
  • コードをデータとして処理し、実行時に任意のコードを生成できる強力なマクロシステム(多くの場合、新しい構文で「言語を拡張」するか、DSLを作成するために使用されます)
  • 多くの場合、関数型プログラミングスタイルで使用されますが、他のパラダイムに対応する能力があります
  • REPL=(つまり、実行中のコードのインスタンスで対話的に開発する)を使用した対話型開発の重視

一般的なLISPの特徴的な機能:

Clojureの特徴的な機能:

  • 任意のJavaライブラリを直接使用できるため、最大のライブラリエコシステム
  • ベクトル[]およびマップ{}標準リストに加えて標準として使用される()-ベクトルとマップの一般的な有用性に加えて、これは一般的に読みやすくする革新であると考える人もいます。
  • Haskellにやや触発された、不変性と遅延関数型プログラミングの重視
  • 言語レベルでソフトウェアトランザクションメモリによってサポートされる強力な同時実行機能(注目に値する: http://www.infoq.com/presentations/Value-Identity-State-Rich-Hickey

スキームの特徴的な機能:

  • ほぼ間違いなく最も簡単で習得しやすいLISP
  • 衛生マクロ( http://en.wikipedia.org/wiki/Hygienic_macro を参照)-マクロ展開での偶発的なシンボルキャプチャの問題をエレガントに回避
94
mikera

上記の人々はいくつかのことを逃しました

  1. Common LISPにはベクターとハッシュテーブルもあります。違いは、Common LISPはベクトルに#()を使用し、ハッシュテーブルには構文を使用しないことです。 Schemeにはベクトルがあります

  2. Common LISPには新しいマクロを使用できるリーダーマクロがあります(Schemeの子孫であるRacketも同様です)。

  3. SchemeとClojureには、Common LISPの非衛生的なマクロとは対照的に、衛生的なマクロがあります

  4. すべての言語は近代的であるか、大規模な改修プロジェクトがあります。 Common LISPは過去5年間に広範なライブラリを取得しており(主にQuicklispに感謝)、Schemeにはいくつかの最新の実装(Racket、Chicken、Chez Schemeなど)があり、Clojureは比較的最近作成されました

  5. Common LISPには組み込みのOOシステムがありますが、他のOO使用したかもしれないシステムとはかなり異なります。特に、強制されていません。しないhaveと書くOOコード。

  6. 言語のデザイン哲学は多少異なります。 Schemeは、アクターモデルを理解するための最小限の方言として設計されました。後に教育学に使用されるようになりました。 Common LISPは、生まれた無数のLISP方言を統合するように設計されました。 Clojureは並行性のために設計されました。その結果、Schemeは最小限でエレガント、Common LISPが強力でパラダイムにとらわれない(機能的、オブジェクト指向、何でも)、Clojureは機能的プログラミングを好むという評判を持っています。

47
Cosman246

LISP-1とLISP-2の違いを忘れないでください。

SchemeとClojureはLISP-1です:
これは、変数と関数の両方の名前が同じ名前空間に存在することを意味します。

一般的なLISPはLISP-2です。
関数と変数には異なる名前空間があります(実際、CLには多くの名前空間があります)。

36
paul