驚くべき事実から始めよう
1956年、ダートマスで開かれたある夏の研究集会で、「artificial intelligence」という言葉が初めて公式に使われた。その言葉を作った人物の名前はジョン・マッカーシー(John McCarthy)。
そして彼は2年後の1958年、別の歴史的なものを世界に送り出している。プログラミング言語「LISP」だ。
AIという概念と、AIを実装するための言語を、同じ人間が作った。この事実は、LISPをただの「古い言語」として見過ごせない理由になっている。LISPとAIの歴史的なつながりは このQuantum Zeitgeistの記事 にも詳しい。
LISPとは何か
LISPの正式名称は LISt Processor、つまりリスト処理言語だ。1958年にMITでマッカーシーが設計し、FORTRANの次に古い高水準言語として現在も生き続けている(Wikipedia)。
現代の主な方言(dialect)は以下のとおり。
| 方言 | 特徴 |
|---|---|
| Common Lisp | 標準化されたモダンなLISP |
| Scheme | 最小限の仕様を持つ教育向け方言 |
| Clojure | JVM上で動くモダンなLISP |
| Emacs Lisp | Emacsの設定・拡張に使われる |
この記事では主にCommon Lispの構文を使って説明する。
S式:全ては括弧の中にある
LISPの第一印象は独特だ。
(+ 1 2 3) ; => 6
(* 2 (+ 3 4)) ; => 14
(print "Hello, World!")
演算子が先頭に来て、全体が括弧で囲まれる。これを S式(S-expression) と呼ぶ。慣れるまで違和感があるが、この構造こそがLISPの核心だ。
関数定義もS式で書く:
(defun square (x)
(* x x))
(square 5) ; => 25
リストの操作:
(defvar my-list '(1 2 3 4 5))
(car my-list) ; => 1 (先頭要素)
(cdr my-list) ; => (2 3 4 5) (先頭以外)
(cons 0 my-list) ; => (0 1 2 3 4 5) (要素を先頭に追加)
同像性:コードはデータ、データはコード
LISPの哲学的な核心が「同像性(homoiconicity)」だ。
同像性とは、「プログラムのコードと、そのプログラムが操作するデータが、同じ構造で表現される」という性質を指す。
LISPでは、コードもデータも同じS式で書かれる。
;; これはコード(関数呼び出し)
(+ 1 2 3)
;; これはデータ(リスト)
'(+ 1 2 3)
;; データとして保持し、後でコードとして実行できる
(eval '(+ 1 2 3)) ; => 6
'(クォート)をつけるだけで、コードをデータとして扱える。そしてそのデータをプログラムで操作してから eval で実行できる。
これが何を意味するか。「プログラムがプログラム自身を書き換えられる」ということだ。
マクロ:言語自体を拡張する
同像性の恩恵を最も受けるのが マクロ だ。
LISPのマクロは関数と似ているが、評価タイミングが違う。関数は引数が評価されてから実行されるが、マクロは引数を評価する前に変換処理を行う。つまり、新しい構文を言語に追加できる。
例として、if と逆の動作をする unless を自分で作ってみよう:
;; マクロの定義
(defmacro unless (condition &rest body)
`(if (not ,condition)
(progn ,@body)))
;; 使用例
(unless (> 1 10)
(print "1は10より大きくない"))
; => "1は10より大きくない"
バッククォート(`)、カンマ(,)、カンマアット(,@)を使ったテンプレート構文で、コードを生成する。「コードを生成するコード」だ。
もっと実用的な例として、シンプルなループを作ってみる:
(defmacro while (condition &rest body)
`(loop while ,condition do ,@body))
(let ((i 0))
(while (< i 5)
(print i)
(incf i)))
; => 0 1 2 3 4
他の言語では言語仕様に組み込まれているこれらの構文を、LISPでは自分で定義できる。Pythonの with、Javaの try-with-resources も、LISPマクロで同等のものを実装できる。
「悟り体験」:LISPを"わかった"瞬間
LISPのコミュニティには「悟り体験(Lisp Enlightenment)」という言葉がある。
ハッカー文化の重要人物であるエリック・S・レイモンド(ESR)は、「How to Become a Hacker」の中でこう書いている:
Lisp is worth learning for the profound enlightenment experience you will have when you finally get it; that experience will make you a better programmer for the rest of your days, even if you never actually use Lisp itself a lot.
(LISPを学ぶ価値は、ついに「わかった」と感じる深い悟りの体験にある。その体験はあなたを一生涯にわたってより良いプログラマーにしてくれる。たとえLISP自体をほとんど使わなかったとしても。)
この「悟り」とは何か。コミュニティの議論を読むと、こんな声が多い:
- 「コードとデータが同じものだと気づいた瞬間、世界が変わった」
- 「マクロで言語を拡張できると理解した時、他の言語の制約が急に見え始めた」
- 「括弧が邪魔に見えなくなったころ、突然すべての構造が美しく見えた」
面白いのは、「悟った」と感じる瞬間が人によって違うことだ。同像性に気づく人もいれば、マクロのパワーを体感した瞬間という人もいる。共通しているのは「何かがパチンとはまる感覚」だ。
ポール・グレアムとBlub逆説
Y Combinator創業者のポール・グレアムは、Lispを実際のビジネスで使った有名な人物だ。
1995年、彼はロバート・モリスとともに Viaweb(後のYahoo! Store)を創業し、サービス全体をLispで書いた。当時の競合はJavaやPerlを使っていた。
グレアムは後にエッセイ「Beating the Averages」の中で「Blub逆説」を提唱している。
ある架空の「Blub」というプログラミング言語があるとする。BlubプログラマーはLispを見て「変な言語だ、括弧だらけで意味がわからない」と思う。一方、Blubより劣った言語を見ると「こっちは機能が少なくて弱いな」とわかる。
なぜ非対称なのか。パワーが低い方向は「機能が足りない」とわかる。しかしパワーが高い方向は「自分が使っていない機能が何なのか、そもそも気づけない」からだ。
The programmers Paul worked with kept putting Lisp's power down to "momentum" or "personal taste". But that's not the way it was. We used it because it was more powerful.
LispでViaweb を書いたことで、競合が数週間かかる機能を数日で実装できた。これがスタートアップとしての競争優位になったとグレアムは言う。
Blub逆説は今も生きている。「なぜ関数型言語を学ぶのか」という問いへの答えがここにある。
現代言語への影響
「LISPなんて使わない」と思うかもしれない。しかし現代の主要言語は、LISPの概念を大量に取り込んでいる。
ガベージコレクション はLISPが1959年に初めて実装した。現在ではJava、Python、Go、JavaScriptほぼすべての言語が採用している。
高階関数とラムダ は今や当たり前だが、LISPが50年代から持っていた機能だ。
# Pythonのラムダ(現代)
square = lambda x: x ** 2
list(map(square, [1, 2, 3])) # => [1, 4, 9]
; LISPのラムダ(1958年から)
(mapcar (lambda (x) (* x x)) '(1 2 3)) ; => (1 4 9)
REPL(Read-Eval-Print Loop) もLISPが発祥だ。現在のPython、Node.js、Juliaのインタラクティブ環境はすべてこの概念の子孫だ。
Clojureという現代的なLISP方言はJVM上で動き、Javaのエコシステムをすべて利用できる:
;; Clojure(モダンなLISP)のスレッディングマクロ
(->> (range 1 11)
(filter even?)
(map #(* % %))
(reduce +))
; => 220 (1〜10の偶数の二乗の合計)
このパイプライン処理の思想はElixir、Haskell、最近のJavaScriptのパイプライン演算子提案にも影響を与えている。
コミュニティ
LISPは「死んだ言語」ではない。今も活発なコミュニティが存在する。
- common-lisp.net: Common Lispの公式コミュニティポータル。ライブラリ・実装・MLへのリンクが揃っている
- Clojure: Slack(clojurians.net)に2万人超が参加。実務で使っている人間が多い
- r/lisp: Redditのコミュニティ。哲学的な議論から実践的な質問まで幅広い
-
Quicklisp: Common Lispのパッケージマネージャ。2,000以上のライブラリが登録されており、
(ql:quickload :library-name)で即座に使える
入門はSchemeから始めるのが定番だ。MITの名著「SICP(Structure and Interpretation of Computer Programs)」は、Schemeを使いながら計算の本質を教えてくれる。無料で全文公開されており、世界中のエンジニアに読まれている。
今LISPを学ぶ意味
2026年、ChatGPTやClaudeなどのLLMが溢れる時代にLISPを学ぶ意義はどこにあるか。
思考の再構築 という点が大きい。LISPの同像性とマクロは、「言語はどう動くか」「プログラムとは何か」という問いへの答えを体感させる。PythonやTypeScriptだけ書いていると見えない抽象の層が、LISPを触ることで透明になる。これがESRの言う「悟り体験」だ。
Blub逆説から抜け出す ためにも有効だ。LISPを学ぶことで、今使っている言語の「足りないもの」が見えてくる。それは言語の選択だけでなく、設計の思考にも影響する。
AIの原点を理解する という意味でも価値がある。マッカーシーがLISPを作ったのは、数学的推論をコンピュータに実装するためだった。現代の機械学習とは異なる記号的AI(Symbolic AI)の思想は、現在もAI研究の一角を担っている。
おわりに
LISPは難解に見えて、その核心はシンプルだ。「コードとデータを同じ構造で表現する」というたった一つのアイデアが、ガベージコレクション、REPL、高階関数、マクロという現代プログラミングの礎を生んだ。
AIを生んだ人間が作り、Viawebの競争優位を生み、現代のすべてのプログラミング言語に影響を与えた。LISPはそういう言語だ。
まず括弧と仲良くなることから始めてみよう。悟りはその先にある。