プログラミング
Lispへの道:どのLispを選ぶか
A Road to Lisp: Which Lisp (scotto.me)
要約
Lispは単一の言語ではなく、多くの異なる方言を持つ言語ファミリーです。この記事では、初心者向けのLisp方言の選択に悩む人に向けて、主要な方言(Common Lispなど)の強みと弱みを解説し、Lispプログラミングの学習は新しい思考法を学ぶことであると強調しています。
全文翻訳
Lispへの道:どのLispを選ぶか
2026年7月17日
ほとんどのプログラミング言語は、単一の言語として進化します。Python、Java、Javascript、C++は、新しいバージョンや標準、複数の実装を持っていますが、それでも同じ言語であり続けます。CとC++はGCCまたはClangでコンパイルでき、PythonはCPythonまたはPyPyでコンパイルでき、同じJavaScriptはFirefoxとChromeの両方で実行され、JavaプログラムはJVMまたはGraalVMで実行できます。
Lispはそうではありません。
Wikipediaのページには20以上の異なる方言がリストされており、選択肢が多数あることを意味します。それは、Lispがプログラミング言語のファミリーだからです。それらは同じ基本的な構文を共有しますが、演算子、セマンティクス、標準ライブラリ、言語機能が異なります。
Lisp初心者にとって主な懸念事項の1つは、最初にどの言語方言を学ぶかということです。オンラインフォーラムでこの質問を頻繁に見かけます。答えは、方言は重要ですが、初心者が思うほどではないということです。Lispを学ぶことは、新しい種類のプログラミングを学ぶことです。コードを使って問題を考える新しい方法です。どの言語方言でも基本的な概念を学ぶことができます。そして、一度習得すれば、別の言語方言に切り替えるのは比較的簡単になります。
私は、現在アクティブに使用および保守されている最も関連性の高い方言を簡単に紹介します。あなたの優柔不断を克服し、Lispの旅を始めるための1つを選ぶのに役立つように、それらの長所と短所を強調するように努めます。
あなたが初心者であれば、この記事の多くの概念はあなたにとって完全に新しいかもしれません。まだそれらをあまり心配しないでください。私が初心者だったとき、これらの概念の多くは魅力的で、Lispの世界についてもっと学ぶように私を駆り立てました。
Common Lisp
CLと略されるこの言語は、すべてのLisp方言の中で最も成熟しており、包括的です。言語(ここでは言語と呼びます)は1994年に正式なANSI仕様で標準化されたため、オールドスクールなLispと見なされています。この標準化のおかげで、さまざまなプラットフォームやユースケースを対象とした複数のCommon Lisp実装があります。最も有名な実装はSBCLで、ネイティブコードに直接コンパイルされます。高速でオープンソースであり、最新のハードウェアと互換性があります。これを使用すると、適切に記述されたCommon Lispコードは、CやRustに匹敵するパフォーマンスを達成できます。SBCLは大幅に最適化するため、他の実装よりもコンパイルに時間がかかりますが、Lispファミリーの中で最も高速なコードの一部を生成します。
Common Lispの陰陽ロゴ。
ラムダシンボル(λ)は、アロンゾ・チャーチによって発明されたラムダ計算を参照します。
私が上でCommon Lispが最も包括的な方言であると言ったとき、それはすべてのLispの中で最も広い機能セットを提供することを意味しました。それは、多くの機能をすぐに利用でき、その多くは標準で直接定義されています。たとえば、CLには、言語自体からコンパイルと評価を制御するための関数(COMPILE、LOAD、EVAL、COMPILE-FILEなど)があります。これは、これらの関数をコード内またはREPLで使用して、Lispプロセスに関数をコンパイルしたり、ファイルをロードしたり、コードを評価したりするように指示できることを意味します。CLはDISASSEMBLEも提供しており、コンパイル済み関数のために生成されたマシンコードを検査できます。
Common Lispには、プログラムのデバッグと検査のための最も強力な方法の1つである条件およびリスタートシステムがあります。実行中に条件が発生した場合、Lispプロセスは停止し、その時点でのプログラムの状態とその変数を検査できます。その後、プログラムを再開して操作を再試行したり、条件を無視して実行を続行したりすることを選択できます。これは、Common Lisp REPLが実行中のシステムと深く統合されているためにも可能です。リモートサーバーでプログラムが失敗した場合、そのREPLに接続してライブプロセスを検査し、何が起こったのかを理解できます。
Common Lispは、関数型、命令型、メタプログラミング、オブジェクト指向プログラミングなど、すべての主要なプログラミングパラダイムをサポートしています。CLOSと呼ばれる最も高度なオブジェクトシステムの1つを提供しており、これはマルチディスパッチやジェネリック関数などの機能をサポートしています。これにより、JavaやC++のような一般的なオブジェクト指向言語よりもOOPが柔軟になります。また、Common Lispは動的に型付けされますが、オプションの型宣言を備えた豊かで表現力豊かな型システムを持っていることも注目に値します。
標準化とは、言語が安定していることを意味します。1994年のANSI Common Lispは、今日でも使用されています。そのため、Lispプログラマーは後方互換性の問題に悩まされることはめったになく、古いCommon Lispコードは今日でも完全に動作することがよくあります。たとえば、Peter Norvigによる1991年に出版されたPAIPのような古いLispの本を見ると、多くのコードが最新の実装でも動作することがわかります。Common Lispでは、RubyやPythonのような言語で典型的な非互換性の問題に遭遇することははるかに少なくなります。最近更新されていないCommon Lispライブラリでさえ、言語の新しいバージョンに継続的に適応する必要がないため、システム上で問題なく動作することがよくあります。
Common Lispには、より広範なデータ構造のための簡潔なリテラル、永続的な不変コレクション、遅延シーケンス、組み込みの汎用パターンマッチングなど、新しい言語で一般的になったいくつかの便利な機能が欠けています。
Common Lispは、1980年代にいくつかの既存のLisp方言を統合して単一の言語として設計されました。その設計者は、既存のLispプログラマーが完全に新しい構文を学ぶ必要なしに言語を採用できるように、それらの古い方言の構文とパターンを多く保持することを選択しました。
Common Lispには、中央の方向性や企業のスポンサーがいません。コミュニティは比較的小さく、複数の実装、プロジェクト、コミュニケーションチャネルに分散しています。主に言語を維持するボランティアで構成されています。ガイドやヘルプを見つけるのは少し難しい場合があります。チュートリアルは単純すぎるか高度すぎるかのどちらかであり、ドキュメントは常に見つけやすいわけではありません。
現在、Rigetti Computingで量子コンピューティングに使用されており、Grammarlyのコア文法サービスに使用され、Googleフライト検索も支えています。注目すべきは、Steamでリリースされ、完全にCommon Lispで書かれたオープンソースビデオゲームであるKandriaです。
興味深い事実:Paul Grahamは元々、Racketに基づいたArcというカスタムLisp方言でHackerNewsを書いていました。今日、Daniel Gackle(@dang)はそれをArcのCommon Lisp実装であるClarcで再実装し、SBCL1で動作し、1日あたり約1000万ページを提供しています。
Common Lispが輝く場所
CLはすべての主要なオペレーティングシステムでネイティブコードにコンパイルされ、高速な実行を達成できますが、起動時間はわずかに遅くなります。そのため、長時間実行されるプロセスに最適です。Lisp方言の中で最も強力なREPLの1つを提供しており、学習曲線は急ですが、短時間で堅牢なソフトウェアを書くのに最も高速な言語の1つと見なすことができます。CLは、量子コンピューティングのように研究とプロトタイピングを迅速なイテレーションで行う必要がある場合、または仕様が完全に定義されておらず頻繁に変更され、ソフトウェアが迅速に適応する必要がある場合(スタートアップなど)に輝きます。Paul Grahamは、Common Lispが彼のインターネットスタートアップが競争に打ち勝つのをどのように助けたかについて、有名で感動的な記事を書きました。
学習リソース
良い出発点は、このシリーズを書くきっかけとなったSteve Loshの「A Road to Common Lisp」です。初心者にとって最もアクセスしやすい書籍の1つは、Peter Seibelの「Practical Common Lisp」で、すべてオンラインで入手できます。最も重要な概念が章にきれいに分けられているため、私が読んだ中で最も優れた言語入門書です。より遊び心のある入門書は「Land of Lisp」で、面白いキャラクターやコミックを使ってゲームを通してプログラミングを教えています。私が楽しんだより高度な書籍は、マクロに特化しているPaul Grahamの「On Lisp」です。CLの最高のIDEサポートは、Emacs + Sly/Slime(Doomはすでにサポートしています)またはVim + VLimeです。より弱い代替...