私はそれらがlispと呼ばれる同じ言語族の方言であることを知っていますが、違いは正確には何ですか?可能であれば、構文、特性、機能、リソースなどのトピックをカバーする概要を教えてください。
4 に答える
それらはすべて多くの共通点があります:
- 動的言語
- 強いタイプ
- 編集済み
- Lispスタイルの構文、つまりコードはLispデータ構造(フォーム)として記述され、最も一般的なパターンは次のような関数呼び出しです。
(function-name arg1 arg2)
- コードをデータとして扱い、実行時に任意のコードを生成できる強力なマクロシステム(多くの場合、新しい構文で「言語を拡張」するか、DSLを作成するために使用されます)
- 他のパラダイムに対応する能力はありますが、関数型プログラミングスタイルでよく使用されます
- REPLを使用したインタラクティブな開発に重点を置いています(つまり、コードの実行中のインスタンスでインタラクティブに開発します)
一般的なLispの特徴的な機能:
- 強力なOOPサブシステム(Common Lisp Object System)
- おそらく最高のコンパイラです( http://benchmarksgame.alioth.debian.org/u64q/which-programs-are-fastest.htmlによると、Common Lispは最速のLispですが、それほど多くはありません.....)
Clojureの特徴的な機能:
- 任意のJavaライブラリを直接使用できるため、最大のライブラリエコシステム
- 標準リストに加えて標準として使用されるベクトル
[]
とマップ-ベクトルとマップの一般的な有用性に加えて、これは一般的に読みやすくする革新であると考える人もいます{}
()
- Haskellに多少触発された、不変性と怠惰な関数型プログラミングをより重視
- 言語レベルのソフトウェアトランザクショナルメモリによってサポートされる強力な同時実行機能(注目に値する:http://www.infoq.com/presentations/Value-Identity-State-Rich-Hickey)
スキームの特徴的な機能:
- 間違いなく、Lispを学ぶのが最も簡単で簡単です
- 衛生的なマクロ(http://en.wikipedia.org/wiki/Hygienic_macroを参照)-マクロ展開での偶発的なシンボルキャプチャの問題をエレガントに回避します
上記の人々はいくつかのことを逃しました
CommonLispにはベクトルとハッシュテーブルもあります。違いは、Common Lispがベクトルに#()を使用し、ハッシュテーブルに構文を使用しないことです。スキームにはベクトルがあります、私は信じています
Common Lispにはリーダーマクロがあり、新しいブラケットを使用できます(Schemeの子孫であるRacketも同様です)。
Common Lispの非衛生的なマクロとは対照的に、SchemeとClojureには衛生的なマクロがあります
すべての言語は現代的であるか、大規模な改修プロジェクトがあります。Common Lispは過去5年間で大規模なライブラリを取得しており(主にQuicklispのおかげで)、Schemeにはいくつかの最新の実装(Racket、Chicken、Chez Schemeなど)があり、Clojureは比較的最近作成されました
Common LispにはOOシステムが組み込まれていますが、これまで使用していた他のOOシステムとはかなり異なります。特に、これは強制されません。OOコードを記述する必要はありません。
言語の設計哲学は多少異なります。スキームは、アクターモデルを理解するための最小限の方言として設計されました。それは後に教育学に使われるようになりました。Common Lispは、発生した無数のLisp方言を統合するように設計されました。Clojureは並行性のために設計されました。その結果、Schemeは最小限でエレガントであり、Common Lispは強力でパラダイムにとらわれず(関数型、OOなど)、Clojureは関数型プログラミングを好むという評判があります。
Lisp-1とLisp-2の違いを忘れないでください。
SchemeとClojureはLisp-1です。
つまり、変数と関数の名前の両方が同じ名前空間に存在します。
Common LispはLisp-2です:
関数と変数は異なる名前空間を持っています(実際、CLは多くの名前空間を持っています)。
GimpはSchemeで書かれています:)
実際、C ++で書かれているかもしれないと考えるソフトウェアの割り当ては、おそらくLispの傘の下で行われたものであり、黄金の林檎を束から選ぶのは困難です。事実、C ++は必ずしも人気があったわけではなく、更新の歴史があるため、今日だけ人気があるようです。世紀の後半の間、C ++はマルチスレッドさえ利用していませんでした。それは、Pythonが今日、役に立たない未テストのバグのあるグルーコードの汚水溜まりである場所でした。少し早送りすると、関数型プログラミングの増加が見られます。これは、適応またはダイのようなものです。適応部分に関する限り、Javaはそれを正しく持っていると思います。
SchemeはLisp言語を単純化するように設計されており、それが実際に普及したことがないことを除いて、その唯一の目的でした。Clojureは、JVMのSchemeを単純化することを意味するのと同じようなことをしていると思います。他のすべてのJVM言語と同じように、ユーザーエクスペリエンスを膨らませるためだけに、Javaランドでの定型文の作成を簡素化します。