Lispにはいくつかの異なる方言があることを私は知っています。Lispを学ぶことは新しい知的経験になると判断したので、どのLisp方言を学ぶべきか、そしてその理由を知りたいと思います。
他より人気のあるものはありますか?それらのいずれかが、より「完全」であり、より適切に文書化され、サポートされていますか?この方言の長所と短所は何ですか?
シンプルさとクリーンさのバランス、魅力的な機能、興味深く便利なソフトウェアを (自分自身で) 作成できるだけでなく、学習ツールとしても機能するプラットフォームを探したいと考えています。(この最後の方が、ずっと長く学習を継続できます。) 以下にいくつかの可能性を示します。
図式。おそらくすべての方言の中で最もきれいです。これが、 The Little Schemerが LISP から Scheme に翻訳された理由であることは間違いありません。5番目のScheme標準仕様であるR5RSは、それ自体が素晴らしい教育です。これは、私が今まで読んだ中で最も優れた言語とライブラリの仕様であると同時に、合理的に包括的である最短のものかもしれません。PLT スキーム(現在のRacket) プラットフォームには、かなり適切なインタープリターとコンパイラーが含まれており、スクリプト作成に適しています。また、学習に優れたビジュアル ツールもいくつか備えています。
一般的な Lisp。おそらく最も移植性が高く、包括的なバリアントです。これは、商用ソフトウェアなどを作成する場合に必要となる可能性が最も高いものです。標準は広範なライブラリを定義しており、それ以外にも多くのライブラリが利用可能です。CLOSがあり、オブジェクト指向言語よりもオブジェクト指向について多くのことを学べるでしょう。また、いくつかのコンパイラは非常に優れています。欠点には、Scheme にはない欠点がいくつかあり (関数を参照する変数に別の名前空間を使用するなど)、クリーンでシンプルではありません (拡張機能を持たなければならず、妥協が必要になった場合のように)。現実世界の大規模なアプリケーションの場合)、衛生的なマクロを持たず、Scheme よりもはるかに再帰を重視していません。
クロージャ。これは JVM で実行されるため、Java 開発者にとっては有利になる可能性があります。いくつか問題点があります (たとえば、テール コールの最適化を明示的に要求する必要がありますが、TCO が JVM に追加された場合、これはいつか変更される可能性があります)。マクロは衛生的ではありませんが、変数のキャプチャを回避するのに役立ついくつかの機能を備えているため、本当に必要な場合は変数をキャプチャできますが、CL よりも誤って変数をキャプチャするリスクが少なくなります。すべての Java ライブラリに簡単にアクセスできます。これはおそらく「実世界」のコードにとっては良いことであり、学習に関してはかなり無意味です。永続的なデータ構造と STM のサポートのための一連のライブラリがあり、同時実行の観点から非常に興味深いものになっています。もしあなたが' 並行プログラミングと並列プログラミングを処理する新しい方法についてさらに学習することに興味があります。Clojure は、大規模な実稼働アプリケーションで Java と同じように使用できるように見えます。実稼働アプリケーションで行うような「醜いこと」を実行する機能を備えているという意味であなたが学んでいるとき。
Emacs Lisp. LISP に関して言えば、これは良い例の 1 つではありません。その最大の欠点の 1 つは動的スコープですが、他にも多くの欠点があります。ただし、Emacs ユーザーの場合、これは、エディターの使用を改善するために学習できる最も強力なツールである可能性があります。しかし、Emacs を拡張する方法を超えて、Emacs Lisp を学ぶことで実際にどれだけのことを学べるかは、未解決の問題です。高階関数などの興味深いテクニックが Emacs Lisp で実際にどのくらいの頻度で使用されているかはわかりません。
2018年アップデート
私がこの記事を書いてからほぼ 10 年が経ち、Lisp ファミリーの言語は現在、一般的なプログラマーの意識の中で大きな牽引力を得ているようです。これの多くは、Clojure に関連しているように見えます。Clojure は、それ自体が Lisp の適切に分離された方言になり、独自の優れたアイデアの多くを導入しただけでなく、JavaScript をターゲットにしたほぼ同一のバージョンを持ち、他の多くの Lisp に影響を与えました。他のプラットフォームをターゲットにしています。たとえば、Hyは CPython AST とバイトコードをターゲットにしており、まず Python との相互運用性を目指していますが、「疑わしい場合」は Clojure のアイデアを使用しています。(ただし、最新のコミットから、後者は少し変更されている可能性があります。)
これが意思決定プロセスにもたらす大きな変化は、Perl 、Ruby 、Erlang 、Go 、さらには Perl 、Ruby 、Erlang 、Go など、Lisp または Lisp に似た言語が利用可能であり、既に使用している言語またはプラットフォームと相互運用できるものを検討する必要があることです。マイクロコントローラー上の C++。
これは、私が今までに読もうとした中で最も驚くほど楽しいが、非常に難しい本の1つであるLittle Schemerのおかげです。
SBCLでCommonLispをお勧めします。この組み合わせは、高速で強力、成熟しており、十分に文書化されています。
また、Clojure は最近多くのマインドシェアを獲得していますが、これには正当な理由があります。優れたデータ構造、非常に優れた同時実行サポート (この点で、Scheme と CL は恥ずべきことです)、そして優れたコミュニティです。それは比較的単純でもあり、CL は少なくとも C++ と同じくらい複雑です。
これは、私が CL や Scheme を楽しんでいないと言っているわけではありません。私はSICPでSchemeを学びました。そしてCLは私をClojureに連れて行ってくれました。それはすべて、私が推測するあなたの目標に依存します。非常に実用的な Lisp を学びたい場合は、Clojure を使用してください。それ以外の場合、CL またはスキームはどちらも優れています。
私は学校でSchemeを学びました。それは素晴らしい学習経験であり、関数型プログラミングの基礎を決して忘れることはありません. LISP の有用性の核心であるステートレス ラムダ計算を理解していれば、LISP のどのバージョンを選択しても問題ありません。
MIT のプログラミング入門コースで、Scheme から Python に切り替えた理由に関する興味深い記事を次に示します。
私はオブジェクト指向プログラミングが好きで、CLOS は最も優れたオブジェクト システムであるため、CL の方が好きです。
少なくとも最初は、それらすべてを言うでしょう。最終的には、Scheme か Common Lisp のどちらかを優先するようになるでしょうが、どちらにも十分な違いがあるため、世の中に出回っているすべてのものを把握するのが最善です。
たとえば、Scheme には継続があり、それらは Common Lisp で実装できますが、Scheme でそれらについて学ぶのは良いことです。
レキシカル スコープとダイナミック スコープの違いを学ぶことは重要です。Common Lisp と elisp の両方を学べば、両方の意味を知ることができます。
LFE (Lisp Flavored Erlang) がいいでしょう。Erlang VM の上に Lisp 構文を含めることができます。