7.1 跨越時空的對話:Lisp 如何直接將邱奇的 \(\lambda\) 演算搬進電腦?#
1956 年的達特茅斯:一個夏天改變兩個學科#
1956 年夏的達特茅斯會議(麥卡錫、明斯基、香農、羅切斯特主持)正式命名了「人工智慧」。會議的資助來自洛克菲勒基金會,議程天真而宏大(「一個夏天解決 AI」)。AI 與認知科學在此同時受洗,而約翰·麥卡錫(John McCarthy, 1927–2011)帶走的問題之一是:
如何讓機器做符號推理,而不只是數值計算?
當時的主流語言(Fortran)處理浮點數是一流的,但處理符號列表(棋局、邏輯公式、句子)束手無策。麥卡錫需要一門符號計算語言。他熟知邱奇的 \(\lambda\) 演算(普林斯頓的邏輯訓練)——1958 年,在 IBM 與 MIT 的交替工作中,Lisp(LISt Processor)誕生。
從 \(\lambda\) 演算到 S 表達式#
Lisp 對 \(\lambda\) 演算的翻譯驚人地直白:
| \(\lambda\) 演算 | Lisp |
|---|---|
| \(\lambda x. x+1\) | (lambda (x) (+ x 1)) |
| 應用 \(f\,a\) | (f a) |
| \(\beta\) 規約 | 函數調用 |
| 高階函數 | 函數是一等公民 |
| 遞歸(Y 組合子) | 直接支援遞歸(DEFINE) |
Lisp 程式本身也是嵌套列表——而列表正是 Lisp 的原生資料結構。語法、資料、語義三者同構。麥卡錫 1960 年的論文〈遞歸函數的符號表達式與它們的機器計算〉做了一件空前的事:用 Lisp 自己寫了一個 Lisp 解譯器(eval/apply 只有幾十行)——自舉(bootstrapping)從此成為語言設計的標準儀式。
歷史細節:Lisp 原本只打算用「M 表達式」(數學式寫法),「S 表達式」(括號列表)只是機器內部表示。當 S 表達式的 eval 被實現後,大家發現直接寫 S 表達式更方便——括號地獄不是設計決策,是一個意外的既成事實。今天的 Clojure 重拾了更多 M 表達式風格,歷史開了個溫柔的玩笑。
為什麼是列表?——馮·諾伊曼架構上的圖靈機血統#
Lisp 的底層是 cons cell(兩個指標的格子)構成的鏈表——這是對圖靈機紙帶的一種「離散化重述」:記憶體是一個大圖,符號結構是指標圖形。1960s 的 Lisp 機器(Symbolics)甚至造了以指標圖為一級對象的硬體——理論模型直接驅動了晶片設計。
Lisp 的兩場社會實驗#
1. AI 的母語(1958–1980s):符號 AI(專家系統、定理證明、自然語言處理)全在 Lisp 上建造。1970s–80s 的「AI 泡沫」(日本第五代電腦計畫 1982、Lisp 機器產業 Symbolics/LMI)隨專家系統商業化失敗而破裂(1987 AI winter)——AI 的第一次寒冬,也是 Lisp 機器產業的死亡。歷史在 2020s 重演的影子:算力路線(連接主義)淘汰符號路線的過程,同樣帶走了一個產業。
2. 個人運算的搖籃:Smalltalk(第 10 章)的環境哲學、Emacs(1976,內嵌 Lisp 解譯器——編輯器即平台)、以及後來的 Scheme 教學傳統(SICP,1985——MIT 的經典教材,把計算當作組合、抽象與解釋的藝術)。
Lisp 為後世貢獻的發明清單#
幾乎所有現代語言特性的第一次,都在 Lisp:
| 發明 | 年代 | 現代後裔 |
|---|---|---|
| 條件表達式 if-then-else | 1958 | 一切語言 |
| 遞歸函數呼叫 | 1958 | 一切語言 |
| 動態型別 | 1958 | Python、JS |
| 垃圾回收 | 1959(下一節) | Java、Go、C# |
| 一等函數 / 高階函數 | 1958 | JS 箭頭函數、Python 裝飾器 |
| 巨集(代碼即資料) | 1963 | Rust macro、Julia macro |
| REPL(互動式環境) | 1960s | Jupyter、所有現代 IDE 的即時回饋 |
| 副程式庫生態 / 包管理萌芽 | 1960s | npm、PyPI |
Paul Graham 的著名論斷(Beating the Averages, 2001):Lisp 的威力在於它是「秘密武器」——用更強的語言做事,等於用更少的人做更多的事。他的創業公司 Viaweb 用 Lisp 建 Web 商店,1998 年賣給 Yahoo——語言優勢轉化為商業優勢的著名案例,也是 2000s 新創圈重視「技術選型即競爭策略」思潮的起點。
與 ALGOL 陣營的哲學對照#
| Lisp | ALGOL | |
|---|---|---|
| 理論祖先 | \(\lambda\) 演算(邱奇) | 圖靈機的工程化 + 文法(BNF) |
| 語法 | 極簡(全是括號) | 精緻(begin-end、類型聲明) |
| 型別 | 動態 | 靜態 |
| 態度 | 語言是可塑材料(宏、元程式) | 語言是嚴格契約(規範、標準) |
| 社群 | 研究者、駭客 | 學術委員會、產業標準組織 |
這兩條血統的張力(可塑性 vs 契約性)將貫穿全書:動態 vs 靜態(13.3)、腳本 vs 系統(14 章)、乃至 LLM 生成 vs 編譯器驗證(16 章)。