Paul Graham:ansi Common Lisp@1996

ANSI Common Lisp 主要論點

保羅·格雷漢姆在《ANSI Common Lisp》的序言與引言中,闡述了學習和使用 Common Lisp 的核心價值和獨特優勢。他提出的主要論點可以歸納為以下幾個方面:

  1. Lisp 是一種歷史悠久但設計超前的程式語言: Lisp 起源於 1958 年,是僅次於 FORTRAN 的最古老程式語言。然而,它並未因時間而被淘汰,反而因其前瞻性的設計,至今仍位居程式語言技術的前沿。其關鍵在於其「為演化而設計」的特性,允許使用者定義新的運算元,並能輕鬆實現新的抽象概念(如物件導向程式設計)。這種內在的適應性使得 Lisp 不像其他語言那樣容易過時。

  2. Lisp 提供其他語言所缺乏的強大工具和抽象: 作者認為學習 Lisp 的主要原因在於它能讓你做一些在其他語言中難以實現,甚至無法實現的事情。他以一個簡單的例子說明:在 Lisp 中可以輕易寫一個函數 addn,它接受一個數字 n,並返回另一個函數,這個返回的函數能將 n 加到其參數上(即閉包)。這種「函數可以返回函數」的能力,以及將函數作為一等公民(first-class objects)來操作的特性,在許多主流語言中是不可用的。作者指出,其他語言的限制會形塑程式設計師的思維,讓他們甚至無法想像或「想要」那些語言無法提供的功能。Lisp 的閉包、巨集(macros)、執行時型別(run-time typing)等特性,共同構成了遠超許多現代語言(如 C++)的抽象能力。

  3. Lisp 程式碼本身就是 Lisp 資料結構(列表),這賦予了巨集獨特的能力: Lisp 的語法非常統一且基於列表(lists)。所有的程式碼,無論是簡單的運算或是複雜的函數定義,都以列表的形式表示。這是一個極其強大的特性,意味著 Lisp 程式可以將其他 Lisp 程式碼作為資料來操作、生成和轉換。巨集就是這種能力的典型體現:它們是「寫程式來寫程式」的程式。巨集在 Lisp 中是廣泛使用且非常有價值的技術,它允許程式設計師在語言層面上進行擴展和客製化,這是其他主流語言難以比擬的。巨集的存在改變了程式設計師的工作方式和思維模式。

  4. Lisp 促成了一種全新的、更有效的程式開發方法(自下而上設計與快速原型開發): 傳統的程式開發遵循「規劃-實現」模型,強調詳細的規格說明和事前的規劃,假設可以避免錯誤。然而,作者指出這種模型忽略了人類的局限性,規格說明往往存在缺陷,程式碼也充滿錯誤。Lisp 及其環境(如互動式頂層環境)支持一種不同的方法:自下而上(bottom-up)的程式設計。程式設計師不僅自上而下地分解問題,也自下而上地構建和擴展語言本身,使其更貼合程式的需求。這種方法使得將通用部分抽象為語言層面(utilities或領域特定語言)成為可能,從而提高了程式碼的可重用性。同時,Lisp 的互動性和動態性使得「快速原型開發」成為可能,程式設計師可以在很短的時間內構建原型,並根據實現經驗不斷迭代和完善設計。這種方法降低了犯錯的成本,因為錯誤能夠被更快地發現和修正,使得開發過程更具探索性。

  5. Lisp 的互動式環境縮短了開發週期,實現「即時」程式設計: 與許多需要漫長「編輯-編譯-測試」循環的語言不同,Lisp 的互動式頂層(toplevel)環境允許程式設計師即時評估表達式、測試函數和程式碼片段。這種「即時」的開發體驗極大地提高了開發效率,使得程式設計更具流暢性和實驗性。結合自下而上的開發方法,程式設計師可以像搭積木一樣逐步構建和測試程式的各個部分,信心十足地推進開發。

  6. Lisp 風格的程式設計導致更優雅、更少錯誤的程式碼: Lisp 鼓勵函數式程式設計(functional programming),強調通過返回值而不是副作用來實現功能。函數式程式碼更易於測試和理解,因為其行為僅取決於輸入。Lisp 的抽象能力(如閉包和巨集)使得程式碼更加簡潔。而其執行時型別和垃圾回收機制則消除了許多低層級錯誤(如懸空指標)。結合快速的開發週期,Lisp 風格使得程式設計師能夠寫出更短、更清晰、更健壯的程式碼,從而提升程式設計的樂趣和效率。作者將這種轉變類比為繪畫從蛋彩畫轉向油畫,新工具的靈活性開啟了新的藝術可能性。

  7. 學習 Lisp 不僅是學習一門新語言,更是學習一種新的思考方式: Lisp 獨特的特性和程式設計風格會挑戰並改變程式設計師固有的思維模式。學習如何有效利用閉包、巨集和自下而上的方法,會讓程式設計師獲得新的抽象工具和解決問題的視角,這種經驗會影響他們未來使用任何程式語言的方式。

總之,作者認為 Common Lisp 的價值在於其獨特的語言特性如何共同促成一種更高效、更靈活、更強大且更令人愉悅的程式設計方法。它不僅提供了其他語言所沒有的工具,更重要的是,它使得一種與傳統迥異但更適合現代複雜軟體開發的風格成為可能,並且這種風格正逐漸影響其他程式語言的發展。