web-dev-qa-db-ja.com

LISPのどの方言を学ぶべきですか?

LISPにはいくつかの異なる方言があることを知っています。 LISPを学ぶことは新しい知的体験になると判断したので、どのLISP方言を学ぶべきか、そしてその理由を知りたいと思います。

他よりも人気のあるものはありますか?それらのいずれかが、より完全に文書化され、サポートされているように、より「完全」になっていますか?この方言の長所と短所は何ですか?

83
Humphrey Bogart

シンプルさと清潔さのバランス、魅力的な機能、および興味深く有用なソフトウェアを(自分自身で)作成できるプラットフォームであり、学習ツールとしての役割を果たしたいと考えています。 (この最後の方法により、さらに長く学習を続けることができます。)いくつかの可能性があります。

  1. スキーム。おそらくすべての方言の中で最もクリーン。 The Little Schemer がLISPからSchemeに変換された理由は間違いありません。 5番目のScheme標準仕様である R5RS は、それ自体が素晴らしい教育です。それは私が今まで読んだ中で最も素晴らしい言語とライブラリの仕様であるかもしれませんし、合理的で包括的な最短のものかもしれません。 PLT Scheme (現在のRacket)プラットフォームには、かなりまともなインタープリターとコンパイラーが含まれており、スクリプト作成に適しています。また、学習に優れたビジュアルツールもあります。

  2. Common LISP。おそらく最もポータブルで包括的なバリアントです。これは、商用ソフトウェアなどを作成したい場合に最も必要なものです。この標準では広範なライブラリが定義されており、さらに多くのライブラリが利用可能です。 [〜#〜] clos [〜#〜] があり、おそらくOOについてより多くを教えてくれるでしょう。任意のOO言語が使用でき、一部のコンパイラは非常に優れています。欠点には、Schemeにはないいくつかのいぼが含まれます(関数を参照する変数の個別の名前空間を持つなど)、それほどクリーンでシンプルではありません(拡張機能が必要で妥協が必要なものの場合のように)現実の世界での大規模なアプリケーションの場合)、衛生的なマクロを持たず、Schemeよりもはるかに少ない再帰を強調します。

  3. Clojure。これはJVM上で実行されるため、Java開発者にとってすぐそこに足を踏み入れる可能性があります。いくつかの欠点があります(たとえば、TCOがJVMに追加されると、いつか変更される可能性がありますが、末尾呼び出しの最適化を明示的に要求する必要があります)マクロは、衛生的ではありませんが、変数のキャプチャを回避するための機能があります。したがって、CLよりも誤ってそうするリスクを減らしながら、本当に必要な場合に変数をキャプチャできます。すべてのJavaライブラリに簡単にアクセスできます。それはおそらく「現実の世界」のコードにとっては良いことであり、学習の面ではかなり無意味です。永続的なデータ構造用の一連のライブラリとSTMのサポートがあり、同時実行の観点から非常に興味深いものになっています。並行プログラミングと並列プログラミングを扱う新しい方法について詳しく知りたい場合は、おそらくこれが最善の策です。 Clojureは、大規模な実稼働アプリケーションでJavaと同じように使用できるように見えます。つまり、実稼働アプリケーションで行う「lyいこと」を行う能力があるという意味で、やりたくないこととしないことです。学習しているとき。

  4. Emacs LISP。LISPに関しては、これは優れた例ではありません。最大の欠点の1つは動的スコープですが、他にも多くの欠点があります。しかし、もしあなたがEmacsユーザーなら、これはエディタの使用を改善するために学ぶことができる最も強力なツールかもしれません。ただし、Emacsを拡張する方法を超えて、Emacs LISPを学習することで実際にどれだけ学ぶことができるかは、私にとって未解決の問題です。 Emacs LISPで高次関数などの興味深いテクニックが実際にどれほど頻繁に使用されているかはわかりません。

2018アップデート

私がこの投稿を書いてからほぼ10年が経ち、LISPファミリーの言語は現在、一般的なプログラマーの意識において大きな牽引力を得ているようです。この多くはClojureに関連しているようです。Clojureは、LISPの独自の適切な方言になり、独自の優れたアイデアの多くを導入しただけでなく、JavaScriptをターゲットにしたほぼ同一のバージョンを持ち、他の多くのLispに影響を与えています他のプラットフォームをターゲットにします。たとえば、 Hy はCPython ASTとバイトコードをターゲットにし、最初にPythonとの相互運用性を目指しますが、Clojureのアイデアは「疑わしいとき」に使用します。 (最新のコミットからですが、後者は少し変わっているかもしれません。)

これがあなたの意思決定プロセスにもたらす大きな変化は、あなたがすでに使用している言語やプラットフォームで利用可能なLispまたはLISPのような言語を調べて、相互運用できることです PerlRubyErlangGo またはさらに マイクロコントローラ上のC++

68
Curt J. Sampson

Schemeとは、 Little Schemer のみを意味します。

21
J. Polfer

Common LISPを [〜#〜] sbcl [〜#〜] で推奨できます。この組み合わせは、高速で強力、成熟しており、十分に文書化されています。

9

また、最近では、Clojureは多くのマインドシェアを獲得していますが、それには十分な理由があります。優れたデータ構造、非常に優れた同時実行性サポート(この点でSchemeとCLを恥ずかしく思う)、および優れたコミュニティ。また、CLは比較的単純で、CLは少なくともC++と同じくらい複雑です。

これは、私がCLやSchemeを楽しんでいないと言っているわけではありません。 SICPでSchemeを学びました。そしてCLは私をClojureに連れてきました。それは私が思うにあなたの目標に依存します。非常に実用的なLISPを学びたい場合は、Clojureをお勧めします。それ以外の場合、CLまたはSchemeは両方とも素晴らしいです。

8
dnolen

学校で Scheme を学びました。これは素晴らしい学習体験であり、関数型プログラミングの基礎を決して忘れません。有用性の核心であるステートレスラムダ計算を理解している限り、どのバージョンのLISPを選択しても問題ありません。

なぜMIT SchemeからPythonに切り替えられた の入門プログラミングコースでの興味深い記事です。

5
jinsungy

私はオブジェクト指向プログラミングが好きなので、CLが好きです。CLOSは最も優れたオブジェクトシステムです。

5
jrockway

少なくとも最初は、それらすべてを言うでしょう。最終的にはおそらくSchemeまたはCommon LISPの設定を開発しますが、両者には十分な違いがあるため、そこにあるすべてのものを処理するのが最善です。

たとえば、Schemeには継続があり、Common LISPで実装できても、Schemeのそれらについて学ぶことは良いことです。

語彙スコープと動的スコープの違いを理解することは重要です。CommonLISPとelispの両方を学べば、両方の意味を理解できます。

3
justinhj

そもそも一種の「ロード済み」の質問でしたが、OPはおそらくそれを知らなかったでしょう。一般的に、CommonおよびScheme lispersはPCとApple computer "people"のようなもので、混同しません。どちらが最適かは、どちらがあなたのために "動作する"かほど適切ではありません。おそらく、どちらを優先するかは、最初に学習したものに影響される可能性があります(私にとって、空のリストは「なし」である必要があり、CLではNILとして知られています。 Lisper。)EMACSを使用したSBCLとSlimeの統合が好きですが、SBCLは万人向けではありません。1つには、SBCLは非常に厳格です。「楽しみ」たい場合はGNU clispは簡単で、ほぼすべてのプラットフォームで利用できます。

0
Wiley

LFE(LISP Flavored Erlang)はいいでしょう。 Erlang VMの上にLISP構文を置くことができます。

0
user235273