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


120

私はlispと呼ばれる同じ言語のファミリーの方言であることを知っていますが、違いは何ですか?可能であれば、構文、特性、機能、リソースなどのトピックをカバーする概要を教えてください。


3
この質問は他の多くの人々に役立つ可能性があるので、違いのより一般的な概要を求めています。
MaiaVictor 2012年

4
どの投稿がどこに行くべきかについて私はいつも混乱します。これはツールの説明なので、ここやプログラマにとっての質問ですか?論理的には、特定の問題を解決するように求めているわけではないので、プログラマーに移すと思いますが、それは良い答えのIMHOを備えた良い投稿です。
タコグラブバス2012年

1
@octopusgrabbus:質問が多すぎます。「構文、特性、機能、およびリソース」に関する3つのプログラミング言語を比較すると、本やWebサイトを簡単に埋めることができます。Stackoverflowは、プログラミングの問題を抱えている人々のためのもので、百科事典(Wikipedia)ではなく、一般的なディスカッションフォーラム(Usenet)ではなく、言語比較サイト(rosettacode.org)ではありません。これは、質問にコードがあり、解答にもコードが含まれる実際のプログラミング問題に最適です。プラス:誰かが退屈している、またはそれが趣味であるという理由だけで問題を解決しないでください。
Rainer Joswig

3
質問が幅広いからといって、それがここに属していないという意味ではありません。これは完全に明確な質問であり、確かに「実際のプログラミングの質問」です。StackOverflowは主に、Q&A形式でプログラミングに関する知識を共有するための[googleable]コミュニティリソースであることを目的としています。
Dan Burton

@RainerJoswig、私はそれらを研究してきた過去の日にこれらの言語について私が学んだすべてを書くことができましたが、それはスレッドを大きくするでしょう。人々がそのような短い文をググって、答えが得られないことに気づくと、それは本当に悪いことです。大きなテキストは、尋ねられていることをすばやく理解するのを妨げます。このようにすることで、より多くの人々が良い答えによって助けられることが保証されます。
MaiaVictor

回答:


103

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

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

Common Lisp特有の機能:

Clojureの特徴的な機能:

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

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

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

11
これは良いことですが、おそらくラケットは「単なる」スキーム以上のものであることに言及する必要があります。これは、複数の(ただし関連する)言語をサポートするシステムです(独自の言語を定義することもできます)。また、clojureにはooのようなプログラミングを行うさまざまな方法があります(どちらも、closに漠然と似た複数のディスパッチアプローチと、jvmではより効率的なjavaに近いものです)。スキームは、ラケットがサポートするr6rsを備えたより標準的なライブラリ(ooも含む)に向かっています。
アンドリュークック

2
「強く型付けされた動的言語」はマーケティングです。この意味で、Pythonも強く型付けされています。
ron

16
@ron:Python 、Lispのように(JavascriptやVBなどとは異なり)強く型付けされています。代わりに「静的型付け」対「動的型付け」を考えています。すべての種類については、en.wikipedia.org / wiki / Type_systemを参照してください。しかし、そうです、それはマーケティングです
Nas Banov 2013

2
また、この回答にラケットを追加するとよいと思います。コミュニティと言語の焦点のため、Schemeよりもラケットの方が学習しやすいと思います。ラケット(以前の名前はPLTスキーム)は、Lisp / Schemeファミリーの汎用マルチパラダイムプログラミング言語です。その設計目標の1つは、言語の作成、設計、および実装のためのプラットフォームとして機能することです。
mtelesha 2015

Clojureには衛生的なマクロがあります。詳細はこちら:xivilization.net/~marek/blog/2013/09/17/…–
Christopher Kuttruff

50

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

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

  2. Common Lispにはリーダーマクロがあり、(Schemeの子孫であるRacketと同様に)新しいブラケットを使用できます。

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

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

  5. Common LispにはOOシステムが組み込まれていますが、これまで使用してきた他のOOシステムとはかなり異なります。特に、それは強制されていません-あなたはしていない持っている OOコードを記述すること。

  6. 言語によって、設計思想は多少異なります。Schemeは、Actorモデルを理解するための最小限の方言として設計されました。それは後に教育学のために使われるようになった。Common Lispは、出現した無数のLisp方言を統合するように設計されました。Clojureは並行性のために設計されました。その結果、Schemeは最小限でエレガント、Common Lispは強力でパラダイムにとらわれない(機能的、OOなど)ものであり、Clojureは関数型プログラミングを支持するという評判を得ています。


4
ラケットは、互換モードを除いて、Schemeの実装ではありませんstackoverflow.com/questions/3345397を
バグ

Clojureには、私が難しい方法を見つけたため、衛生的なマクロはありませ
ピョン

40

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

SchemeとClojureはLisp-1です。
つまり、変数と関数名の両方が同じ名前空間に存在します。

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


-4

GimpはSchemeで書かれています:)

実際、一部の人々がC ++で記述されていると考えるソフトウェアの割り当ては、おそらくLispの傘下で行われたため、束から黄金のリンゴを選ぶのは困難です。C ++が常に人気があるとは限らず、更新の履歴があるため、今日では人気があるようです。世紀の後半では、C ++はマルチスレッド化さえも利用していませんでした。今日、Pythonは、テストされていない役に立たないバグのあるグルーコードのプールです。少し早送りすると、関数型プログラミングの増加が見られます。これは、適応または死ぬようなものです。Javaは、Adapt部分に関する限り、それは正しいと思います。

SchemeはLisp言語を単純化するために設計されました。これは、実際に普及したことを除いて、それが唯一の目的でした。Clojureは、JVMのSchemeを単純化するために似たようなことをしていると思います。これは、他のすべてのJVM言語と同じように、ユーザーエクスペリエンスを向上させるためのものであり、Javaの土地での定型文の記述を単純化するためだけのものです。


2
「JVMのSchemeを単純化するだけ」「他のすべてのJVM言語と同じように」そうです。
oskarkv 2017年

4
GimpはCで書かれており、スクリプト言語としてScheme、Python、Perlをサポートしています。
lbalazscs
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.